Compare commits
85 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
b82ca42f87 | |||
1a8a216822 | |||
ef528f2f0e | |||
bedfa914d5 | |||
5383ae2faa | |||
d23462657b | |||
b41e36365d | |||
985015cea1 | |||
27d4c79d0e | |||
5b78efb12a | |||
2c2fb7caf2 | |||
d51cefb097 | |||
7637d13e11 | |||
b9b5284f22 | |||
afa65e9f2a | |||
5e1aaca232 | |||
fea649835c | |||
44f475a4ef | |||
60eb7e883c | |||
9b4e0b611a | |||
1be57e34ec | |||
b0e68bbcaa | |||
fa61b94ac8 | |||
3e3c15812b | |||
88555bd059 | |||
ba47d1534c | |||
b7dc0f4057 | |||
0ab9f5f8d2 | |||
1338f29d62 | |||
bc5e2227c8 | |||
654ff82345 | |||
6baeae70e0 | |||
b987972660 | |||
c78526abce | |||
b95e1bb85c | |||
7aa2582129 | |||
3f29d70aba | |||
567d3ddafb | |||
c47f85c639 | |||
40310b4fd7 | |||
f34c274f21 | |||
46e96ee616 | |||
7e60e60e62 | |||
d55ed2d1ca | |||
77c8349c56 | |||
b1c7ed6e29 | |||
e886722d65 | |||
b80b339de3 | |||
efbd05203d | |||
6ca1d76d60 | |||
e1b54056e8 | |||
d5cd610ac7 | |||
91f5ebb376 | |||
ff3b439bda | |||
4672c79181 | |||
83cb07b23c | |||
439a14da1d | |||
d66eef42f6 | |||
337bade549 | |||
eb6503a8ad | |||
1a2e1c767e | |||
858c5479c8 | |||
d36b3d04a8 | |||
da41eb8c6e | |||
775b7a11b4 | |||
23679b86ff | |||
a4f07eb3b3 | |||
6905ab3e56 | |||
05e7f84966 | |||
6e5f840f11 | |||
df37211b7b | |||
bd81e44da0 | |||
37792c5713 | |||
4fb98d9c3c | |||
57a14ec0be | |||
c5d8c26653 | |||
4ff777ee58 | |||
46bb5945c6 | |||
a585d6a32d | |||
b77917fb63 | |||
4673733c4b | |||
f3e63e3cf7 | |||
fb9b3a298c | |||
1539ff120e | |||
20cc592765 |
47
ChangeLog
47
ChangeLog
@ -1,3 +1,50 @@
|
|||||||
|
libisofs-1.3.6.tar.gz Tue Mar 04 2014
|
||||||
|
===============================================================================
|
||||||
|
* Bug fix: Division by zero if HFS+ was combined with TOC emulation for
|
||||||
|
overwritable media.
|
||||||
|
* New API call iso_write_opts_set_joliet_utf16() and ability to read Joliet
|
||||||
|
names as UTF-16BE
|
||||||
|
* New API call iso_conv_name_chars()
|
||||||
|
|
||||||
|
libisofs-1.3.4.tar.gz Thu Dec 12 2013
|
||||||
|
===============================================================================
|
||||||
|
* Giving sort weight 2 as default to El Torito boot images
|
||||||
|
* Encoding HFS+ names in UTF-16 rather than UCS-2.
|
||||||
|
|
||||||
|
libisofs-1.3.2.tar.gz Wed Aug 07 2013
|
||||||
|
===============================================================================
|
||||||
|
* Bug fix: iso_finish() left an invalid global pointer, which a subsequent
|
||||||
|
call of iso_init() would try to dereference.
|
||||||
|
* The sort weight of data files loaded from ISO image is now 2 exp 28 to 1
|
||||||
|
rather than 2 exp 31 - 1 to - 2 exp 31
|
||||||
|
|
||||||
|
libisofs-1.3.0.tar.gz Fri May 17 2013
|
||||||
|
===============================================================================
|
||||||
|
* Bug fix: GPT header CRC was computed from all 512 bytes rather than from 92.
|
||||||
|
* Bug fix: Unspecified Expiration Time and Effective Time of ISO volume was
|
||||||
|
represented by 0-bytes rather than ASCII '0' digits.
|
||||||
|
* Bug fix: Reserved and unused fields of APM entries were not zeroed.
|
||||||
|
* Bug fix: The protective MBR partition for GPT started at block 0 instead of 1.
|
||||||
|
* New option bits with el_torito_set_isolinux_options() and
|
||||||
|
iso_write_opts_set_system_area() to control GRUB2 patching of
|
||||||
|
boot image and MBR.
|
||||||
|
* New API calls iso_image_set_sparc_core() and iso_image_get_sparc_core().
|
||||||
|
|
||||||
|
libisofs-1.2.8.tar.gz Mon Mar 18 2013
|
||||||
|
===============================================================================
|
||||||
|
* Bug fix: Image size prediction altered the pointers to MD5 of data files
|
||||||
|
which stem from a previous session.
|
||||||
|
* Bug fix: Reading damaged Rock Ridge data could cause SIGSEGV by NULL.
|
||||||
|
* New API call iso_image_get_pvd_times().
|
||||||
|
|
||||||
|
libisofs-1.2.6.tar.gz Tue Jan 08 2013
|
||||||
|
===============================================================================
|
||||||
|
* Bug fix: Appended partitions did not obey cylinder alignment
|
||||||
|
* Bug fix: Non-zero partition offset zeroized the MBR copies of GPT partition
|
||||||
|
table entries
|
||||||
|
* Bug fix: Isohybrid production without any boot image led to SIGSEGV by NULL
|
||||||
|
* Bug fix: Prevented a memory fault when reading damaged Rock Ridge information
|
||||||
|
|
||||||
libisofs-1.2.4.tar.gz Fri Jul 20 2012
|
libisofs-1.2.4.tar.gz Fri Jul 20 2012
|
||||||
===============================================================================
|
===============================================================================
|
||||||
* Bug fix: Memory corruption when reading bootable image that was truncated
|
* Bug fix: Memory corruption when reading bootable image that was truncated
|
||||||
|
5
README
5
README
@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
Released under GPL (see COPYING file for details).
|
Released under GPL (see COPYING file for details).
|
||||||
|
|
||||||
Copyright (C) 2008 - 2010 Vreixo Formoso, Mario Danic, Thomas Schmitt
|
Copyright (C) 2008 - 2013 Vreixo Formoso,
|
||||||
|
Mario Danic,
|
||||||
|
Vladimir Serbinenko,
|
||||||
|
Thomas Schmitt
|
||||||
|
|
||||||
libisofs is part of the libburnia project (libburnia-project.org)
|
libisofs is part of the libburnia project (libburnia-project.org)
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
AC_DEFUN([LIBBURNIA_SET_FLAGS],
|
||||||
[
|
[
|
||||||
case $target_os in
|
case $target_os in
|
||||||
freebsd*)
|
freebsd* | netbsd*)
|
||||||
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
LDFLAGS="$LDFLAGS -L/usr/local/lib"
|
||||||
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
CPPFLAGS="$CPPFLAGS -I/usr/local/include"
|
||||||
;;
|
;;
|
||||||
|
16
configure.ac
16
configure.ac
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libisofs], [1.2.4], [http://libburnia-project.org])
|
AC_INIT([libisofs], [1.3.6], [http://libburnia-project.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -40,8 +40,8 @@ dnl
|
|||||||
dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
||||||
dnl
|
dnl
|
||||||
LIBISOFS_MAJOR_VERSION=1
|
LIBISOFS_MAJOR_VERSION=1
|
||||||
LIBISOFS_MINOR_VERSION=2
|
LIBISOFS_MINOR_VERSION=3
|
||||||
LIBISOFS_MICRO_VERSION=4
|
LIBISOFS_MICRO_VERSION=6
|
||||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||||
|
|
||||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||||
@ -51,10 +51,10 @@ AC_SUBST(LIBISOFS_VERSION)
|
|||||||
|
|
||||||
dnl Libtool versioning
|
dnl Libtool versioning
|
||||||
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
||||||
# 2012.07.20 development jump has not yet happened
|
# 2014.03.04 development jump has not yet happened
|
||||||
# SONAME = 66 - 60 = 6 . Library name = libisofs.6.60.0
|
# SONAME = 78 - 72 = 6 . Library name = libisofs.6.72.0
|
||||||
LT_CURRENT=66
|
LT_CURRENT=78
|
||||||
LT_AGE=60
|
LT_AGE=72
|
||||||
LT_REVISION=0
|
LT_REVISION=0
|
||||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ if test x$enable_debug != xyes; then
|
|||||||
CFLAGS="-DNDEBUG $CFLAGS"
|
CFLAGS="-DNDEBUG $CFLAGS"
|
||||||
else
|
else
|
||||||
if test x$GCC = xyes; then
|
if test x$GCC = xyes; then
|
||||||
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter $CFLAGS"
|
CFLAGS="-g -pedantic -Wall -Wextra -Wno-unused-parameter -Wno-char-subscripts $CFLAGS"
|
||||||
fi
|
fi
|
||||||
CFLAGS="-DDEBUG $CFLAGS"
|
CFLAGS="-DDEBUG $CFLAGS"
|
||||||
fi
|
fi
|
||||||
|
@ -95,7 +95,8 @@ tree_print_dir(IsoDir *dir, int level)
|
|||||||
sp[i+1] = ' ';
|
sp[i+1] = ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
sp[level * 2-1] = '-';
|
if (level > 0)
|
||||||
|
sp[level * 2 - 1] = '-';
|
||||||
sp[level * 2] = '\0';
|
sp[level * 2] = '\0';
|
||||||
|
|
||||||
iso_dir_get_children(dir, &iter);
|
iso_dir_get_children(dir, &iter);
|
||||||
|
@ -15,6 +15,8 @@ specifications, some is just rumor which happens to work (maybe not even that).
|
|||||||
|
|
||||||
EL Torito CD booting, for PC-BIOS x86, PowerPC, (old) Mac, EFI.
|
EL Torito CD booting, for PC-BIOS x86, PowerPC, (old) Mac, EFI.
|
||||||
|
|
||||||
|
Boot Info Table and GRUB2 Boot Info
|
||||||
|
|
||||||
Master Boot Record (MBR), for PC-BIOS x86 from (pseudo-) hard disk
|
Master Boot Record (MBR), for PC-BIOS x86 from (pseudo-) hard disk
|
||||||
|
|
||||||
Apple Partition Map (APM), for more modern Mac
|
Apple Partition Map (APM), for more modern Mac
|
||||||
@ -31,6 +33,9 @@ PowerPC Reference Platform (PReP), for IBM PowerPC
|
|||||||
|
|
||||||
Common Hardware Reference Platform (CHRP), for IBM PowerPC
|
Common Hardware Reference Platform (CHRP), for IBM PowerPC
|
||||||
|
|
||||||
|
HP-PA via PALO header version 4
|
||||||
|
HP-PA via PALO header version 5
|
||||||
|
|
||||||
Combinations of boot mechanisms:
|
Combinations of boot mechanisms:
|
||||||
- SYSLINUX isohybrid MBR
|
- SYSLINUX isohybrid MBR
|
||||||
- SYSLINUX isohybrid for MBR, UEFI and x86-Mac
|
- SYSLINUX isohybrid for MBR, UEFI and x86-Mac
|
||||||
@ -48,7 +53,6 @@ Sources:
|
|||||||
El Torito, Bootable CD-ROM Format Specification, Version 1.0, 1995
|
El Torito, Bootable CD-ROM Format Specification, Version 1.0, 1995
|
||||||
which refers to ECMA-119, the standard for ISO 9660 filesystems.
|
which refers to ECMA-119, the standard for ISO 9660 filesystems.
|
||||||
libisofs/eltorito.[ch] by Vreixo Formoso.
|
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
|
ECMA-119 prescribes that the first 32 kB of an ISO 9660 image are System Area
|
||||||
@ -237,10 +241,22 @@ Byte Range | Value | Meaning
|
|||||||
12 - 31 | sel_crit | "Vendor unique selection criteria."
|
12 - 31 | sel_crit | "Vendor unique selection criteria."
|
||||||
---------- | ---------- | ----------------------------------------------------
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Boot Info Table and GRUB2 Boot Info
|
||||||
|
|
||||||
|
Sources:
|
||||||
|
man mkisofs by Joerg Schilling
|
||||||
|
Mail conversations with Vladimir Serbinenko.
|
||||||
|
|
||||||
|
|
||||||
The boot image file content is mostly opaque to the ISO 9660 image generator.
|
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
|
Nevertheless there is a tradition named "Boot Info Table" which prescribes
|
||||||
to write information into byte fields of the boot image file content.
|
to write information into byte fields of the boot image file content.
|
||||||
|
Recent versions of GRUB2 expect a similar patching which has no name yet.
|
||||||
|
For now let's call it "GRUB2 Boot Info"
|
||||||
|
|
||||||
There are no general means known how a producer of ISO 9660 images could
|
There are no general means known how a producer of ISO 9660 images could
|
||||||
detect the need for Boot Info Table production.
|
detect the need for Boot Info Table production.
|
||||||
It rather needs a hint from the user who has to know whether the boot image
|
It rather needs a hint from the user who has to know whether the boot image
|
||||||
@ -249,19 +265,31 @@ The Boot Info Table begins at byte 8 of the boot image content.
|
|||||||
|
|
||||||
Byte Range | Value | Meaning
|
Byte Range | Value | Meaning
|
||||||
---------- | ---------- | ----------------------------------------------------
|
---------- | ---------- | ----------------------------------------------------
|
||||||
8 - 11 | pvd_lba | Block address of the Primary Volume Descriptor
|
8 - 11 | pvd_lba | Block address of the Primary Volume Descriptor.
|
||||||
| | This is the session start LBA + 16.
|
| | This is the session start LBA + 16.
|
||||||
| |
|
| |
|
||||||
12 - 15 | file_lba | Block address of the start of the boot image file
|
12 - 15 | file_lba | Block address of the start of the boot image file
|
||||||
| | content.
|
| | content. Block size is 2048.
|
||||||
| |
|
| |
|
||||||
16 - 19 | file_len | Number of bytes in 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
|
20 - 23 | checksum | The sum of all 32-bit words of the file content
|
||||||
| | file content from byte 64 to file end.
|
| | from byte 64 to file end.
|
||||||
| |
|
| |
|
||||||
24 - 63 | 0 | Reserved
|
24 - 63 | 0 | Reserved
|
||||||
---------- | ---------- | ----------------------------------------------------
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
All numbers are stored little-endian.
|
||||||
|
|
||||||
|
GRUB2 Boot Info represents a particular block address inside the boot image.
|
||||||
|
It may well be combined with Boot Info Table. See GRUB2 script grub-mkrescue
|
||||||
|
use of xorrisofs options -boot-info-table and --grub2-boot-info.
|
||||||
|
|
||||||
|
Byte Range | Value | Meaning
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
2548 -2555 | grub2_adr | Block address of the start of the boot image file
|
||||||
|
| | content plus 5. Block size is 512.
|
||||||
|
| | 64 bit Little-endian.
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -906,18 +934,180 @@ PReP boots via a MBR partition containing only raw ELF and having type 0x41.
|
|||||||
|
|
||||||
Sources:
|
Sources:
|
||||||
Mail conversations with Vladimir Serbinenko.
|
Mail conversations with Vladimir Serbinenko.
|
||||||
|
http://stuff.mit.edu/afs/sipb/contrib/doc/specs/protocol/chrp/chrp1_7a.pdf
|
||||||
|
|
||||||
CHRP is marked by an MBR partition entry of type 0x96 spanning the whole
|
CHRP is marked by an MBR partition entry of type 0x96 spanning the whole
|
||||||
ISO 9660 image.
|
ISO 9660 image.
|
||||||
|
|
||||||
|
The specs in chrp1_7a.pdf promise that CHRP also recognizes ISO 9660 file
|
||||||
|
systems on unpartitioned disks. (See 11.1.1. Media Layout Format)
|
||||||
|
|
||||||
|
Vladimir Serbinenko stated:
|
||||||
PReP boot may be preferable. At least it can co-exist with other partitions
|
PReP boot may be preferable. At least it can co-exist with other partitions
|
||||||
in the ISO image.
|
in the ISO image [without causing overlapping between partitions].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
>>> ??? HP-PA
|
HP-PA via PALO header version 4
|
||||||
|
for HP PA-RISC
|
||||||
|
|
||||||
|
Sources:
|
||||||
|
cdrkit-1.1.10/genisoimage/boot-hppa.c
|
||||||
|
by Steve McIntyre <steve@einval.com>
|
||||||
|
who states "Heavily inspired by palo"
|
||||||
|
|
||||||
|
There are five parameters which get encoded into the first 248 bytes of the
|
||||||
|
System Area: cmdline, bootloader, 32-bit kernel, 64-bit kernel, and ramdisk.
|
||||||
|
They are all mandatory.
|
||||||
|
While cmdline is simply a string of at most 127 characters, the other four
|
||||||
|
point to data files inside the ISO image.
|
||||||
|
|
||||||
|
All numbers are recorded big endian.
|
||||||
|
|
||||||
|
Boot sector components:
|
||||||
|
|
||||||
|
Byte Range | Value | Meaning
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
0 - 1 | 0x8000 | Magic
|
||||||
|
| |
|
||||||
|
2 - 6 | "PALO" | Zero terminated string
|
||||||
|
| |
|
||||||
|
7 - 7 | 4 | Version
|
||||||
|
| |
|
||||||
|
8 - 11 | kern32_adr | Byte address of the "HPPA 32-bit kernel" file
|
||||||
|
| | genisoimage option -hppa-kernel-32
|
||||||
|
12 - 15 | kern32_len | Byte count of the "HPPA 32-bit kernel" file
|
||||||
|
| |
|
||||||
|
16 - 19 | ramdsk_adr | Byte address of the "HPPA ramdisk" file
|
||||||
|
| | genisoimage option -hppa-ramdisk
|
||||||
|
20 - 23 | ramdsk_len | Byte count of the "HPPA ramdisk" file
|
||||||
|
| |
|
||||||
|
24 - 141 | cmdline | "Command line"
|
||||||
|
| | genisoimage option -hppa-cmdline
|
||||||
|
| |
|
||||||
|
232 - 235 | kern64_adr | Byte address of the "HPPA 64-bit kernel" file
|
||||||
|
| | genisoimage option -hppa-kernel-64
|
||||||
|
236 - 239 | kern64_len | Byte count of the "HPPA 64-bit kernel" file
|
||||||
|
| |
|
||||||
|
240 - 243 | bootld_adr | Byte address of the "HPPA bootloader" file
|
||||||
|
| | genisoimage option -hppa-bootloader
|
||||||
|
244 - 247 | bootld_len | Byte count of the "HPPA bootloader" file
|
||||||
|
| |
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
HP-PA via PALO header version 5
|
||||||
|
for HP PA-RISC
|
||||||
|
|
||||||
|
Sources:
|
||||||
|
Public mail conversations with Helge Deller, beginning with
|
||||||
|
https://lists.debian.org/debian-hppa/2014/01/msg00016.html
|
||||||
|
http://git.kernel.org/cgit/linux/kernel/git/deller/palo.git/tree/lib/
|
||||||
|
(especially struct firstblock in common.h and struct partition in part.h)
|
||||||
|
|
||||||
|
There are five parameters which get encoded into the first 248 bytes of the
|
||||||
|
System Area: cmdline, bootloader, 32-bit kernel, 64-bit kernel, and ramdisk.
|
||||||
|
They are all mandatory.
|
||||||
|
While cmdline is simply a string of at most 1023 characters, the other four
|
||||||
|
point to data files inside the ISO image.
|
||||||
|
|
||||||
|
Several fields of the firstblock shall be hardcoded to 0, on advise of
|
||||||
|
Helge Deller. Their description is shown in round brackets.
|
||||||
|
|
||||||
|
The partition table format is the same as with MBR.
|
||||||
|
>>> ??? what block range gets marked in which partition ?
|
||||||
|
>>> If this is only for CD/DVD/BD images, then no partitioning is needed.
|
||||||
|
|
||||||
|
All numbers are recorded big endian.
|
||||||
|
Except flags, all 4-byte integers are signed.
|
||||||
|
|
||||||
|
Boot sector components:
|
||||||
|
|
||||||
|
Byte Range | Value | Meaning
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
0 - 1 | 0x8000 | Magic
|
||||||
|
| |
|
||||||
|
2 - 6 | "PALO" | Zero terminated string
|
||||||
|
| |
|
||||||
|
7 - 7 | 5 | Version
|
||||||
|
| |
|
||||||
|
8 - 11 | kern32_adr | Byte address of the 32-bit kernel file
|
||||||
|
| |
|
||||||
|
12 - 15 | kern32_len | Byte count of the 32-bit kernel file
|
||||||
|
| |
|
||||||
|
16 - 19 | ramdsk_adr | Byte address of the ramdisk file
|
||||||
|
| |
|
||||||
|
20 - 23 | ramdsk_len | Byte count of the ramdisk file
|
||||||
|
| |
|
||||||
|
24 - 141 | 0 | All 0s. Old command line of version 4.
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
220 - 223 | 0 | (Length of uncompressed 32-bit kernel)
|
||||||
|
| |
|
||||||
|
224 - 227 | 0 | (Length of uncompressed 64-bit kernel)
|
||||||
|
| |
|
||||||
|
228 - 231 | 0 | (flags)
|
||||||
|
| |
|
||||||
|
232 - 235 | kern64_adr | Byte address of the 64-bit kernel file
|
||||||
|
| |
|
||||||
|
236 - 239 | kern64_len | Byte count of the 64-bit kernel file
|
||||||
|
| |
|
||||||
|
240 - 243 | ipl_adr | Byte address of the bootloader file
|
||||||
|
| |
|
||||||
|
244 - 247 | ipl_len | Byte count of the bootloader file
|
||||||
|
| |
|
||||||
|
248 - 251 | ipl_entry | >>> Meaning unclear
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
446 - 461 | ========== | MBR/DOS 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
|
||||||
|
| |
|
||||||
|
| |
|
||||||
|
1024 -2047 | cmdline | Zero terminated command line of up to
|
||||||
|
| | 1023 characters
|
||||||
|
| |
|
||||||
|
---------- | ---------- | ----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -1321,12 +1511,21 @@ Sources:
|
|||||||
Mailing list conversations with Vladimir Serbinenko.
|
Mailing list conversations with Vladimir Serbinenko.
|
||||||
|
|
||||||
|
|
||||||
The MBR file that is used with GRUB2 script grub-mkrescue needs only a
|
The MBR file that is used with older versions of GRUB2 script grub-mkrescue
|
||||||
partition table entry which describes the image size.
|
needs only a partition table entry which describes the image size.
|
||||||
|
Newer versions get patched by the block address of the content of the first
|
||||||
|
El Torito boot image. See grub-mkrescue use of xorrisofs option --grub2-mbr.
|
||||||
|
|
||||||
Byte Range | Value | Meaning
|
Byte Range | Value | Meaning
|
||||||
---------- | ---------- | ----------------------------------------------------
|
---------- | ---------- | ----------------------------------------------------
|
||||||
0 - 445 | = opaque = | GRUB2 machine code provided by MBR template
|
0 - 431 | = opaque = | GRUB2 machine code provided by MBR template
|
||||||
|
| |
|
||||||
|
432 - 439 | bootimg_adr| With newer versions of grub-mkrescue:
|
||||||
|
| | Block address of the start of the boot image file
|
||||||
|
| | content plus 4. Block size is 512.
|
||||||
|
| | 64 bit Little-endian.
|
||||||
|
| |
|
||||||
|
440 - 445 | = opaque = | provided by MBR template
|
||||||
| |
|
| |
|
||||||
446 - 509 | ========== | Partition table
|
446 - 509 | ========== | Partition table
|
||||||
| |
|
| |
|
||||||
|
@ -109,8 +109,6 @@ Each Component Record shall have the following format:
|
|||||||
[B] "BP 2 - Component Length (LEN_CP)" shall specify as an 8-bit number the
|
[B] "BP 2 - Component Length (LEN_CP)" shall specify as an 8-bit number the
|
||||||
number of component bytes in the Component Record. This length shall not
|
number of component bytes in the Component Record. This length shall not
|
||||||
include the first two bytes of the Component Record.
|
include the first two bytes of the Component Record.
|
||||||
If any of the bit positions 1-3 is set, the value of this field shall be
|
|
||||||
set to ZERO and no Component Content shall be recorded.
|
|
||||||
This field shall be recorded according to ISO 9660 Format section 7.1.1.
|
This field shall be recorded according to ISO 9660 Format section 7.1.1.
|
||||||
|
|
||||||
[C] "BP 3 to 2 + LEN_CP - Component Content" shall contain the component
|
[C] "BP 3 to 2 + LEN_CP - Component Content" shall contain the component
|
||||||
@ -445,7 +443,7 @@ Program mkisofs emits entry XA
|
|||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
This text is under
|
This text is under
|
||||||
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
Copyright (c) 2009 - 2013 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
It shall only be modified in sync with libisofs and other software which
|
It shall only be modified in sync with libisofs and other software which
|
||||||
makes use of AAIP. Please mail change requests to mailing list
|
makes use of AAIP. Please mail change requests to mailing list
|
||||||
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||||
|
@ -2065,7 +2065,7 @@ int aaip_decode_acl(unsigned char *data, size_t num_data, size_t *consumed,
|
|||||||
unsigned char *rpt;
|
unsigned char *rpt;
|
||||||
char perm_text[4], *wpt, *name= NULL;
|
char perm_text[4], *wpt, *name= NULL;
|
||||||
int type, qualifier= 0, perm, ret, cnt, name_size= 1024;
|
int type, qualifier= 0, perm, ret, cnt, name_size= 1024;
|
||||||
size_t w_size, name_fill= 0, i;
|
size_t w_size= 0, name_fill= 0, i;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
struct passwd *pwd;
|
struct passwd *pwd;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2011 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -96,7 +96,7 @@ int default_create_file(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
|
|
||||||
static
|
static
|
||||||
int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||||
IsoFileSource *src, IsoNode **node)
|
IsoFileSource *src, char *in_name, IsoNode **node)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct stat info;
|
struct stat info;
|
||||||
@ -122,7 +122,15 @@ int default_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = iso_file_source_get_name(src);
|
if (in_name == NULL) {
|
||||||
|
name = iso_file_source_get_name(src);
|
||||||
|
} else {
|
||||||
|
name = strdup(in_name);
|
||||||
|
if (name == NULL) {
|
||||||
|
ret = ISO_OUT_OF_MEM; goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (strlen(name) > LIBISOFS_NODE_NAME_MAX)
|
if (strlen(name) > LIBISOFS_NODE_NAME_MAX)
|
||||||
name[LIBISOFS_NODE_NAME_MAX] = 0;
|
name[LIBISOFS_NODE_NAME_MAX] = 0;
|
||||||
fs = iso_file_source_get_filesystem(src);
|
fs = iso_file_source_get_filesystem(src);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
|
* Copyright (c) 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -47,6 +48,7 @@ struct Iso_Node_Builder
|
|||||||
* Create a new IsoNode from a IsoFileSource. The type of the node to be
|
* Create a new IsoNode from a IsoFileSource. The type of the node to be
|
||||||
* created is determined from the type of the file source. Name,
|
* created is determined from the type of the file source. Name,
|
||||||
* permissions and other attributes are taken from source file.
|
* permissions and other attributes are taken from source file.
|
||||||
|
* But name may be overridden by parameter name if it is not NULL.
|
||||||
*
|
*
|
||||||
* Note that the src is never unref, so you need to free it.
|
* Note that the src is never unref, so you need to free it.
|
||||||
*
|
*
|
||||||
@ -54,7 +56,7 @@ struct Iso_Node_Builder
|
|||||||
* 1 on success, < 0 on error
|
* 1 on success, < 0 on error
|
||||||
*/
|
*/
|
||||||
int (*create_node)(IsoNodeBuilder *builder, IsoImage *image,
|
int (*create_node)(IsoNodeBuilder *builder, IsoImage *image,
|
||||||
IsoFileSource *src, IsoNode **node);
|
IsoFileSource *src, char *name, IsoNode **node);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free implementation specific data. Should never be called by user.
|
* Free implementation specific data. Should never be called by user.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2012 Thomas Schmitt
|
* Copyright (c) 2009 - 2013 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -87,6 +87,12 @@
|
|||||||
#define ISO_GPT_ENTRIES_MAX 248
|
#define ISO_GPT_ENTRIES_MAX 248
|
||||||
|
|
||||||
|
|
||||||
|
/* How many warnings to issue about writing Joliet names which cannot be
|
||||||
|
properly represented in UCS-2 and thus had to be defaultet to '_'.
|
||||||
|
*/
|
||||||
|
#define ISO_JOLIET_UCS2_WARN_MAX 3
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the options for the image generation.
|
* Holds the options for the image generation.
|
||||||
*/
|
*/
|
||||||
@ -94,7 +100,7 @@ struct iso_write_opts {
|
|||||||
|
|
||||||
int will_cancel;
|
int will_cancel;
|
||||||
|
|
||||||
int level; /**< ISO level to write at. (ECMA-119, 10) */
|
int iso_level; /**< ISO level to write at. (ECMA-119, 10) */
|
||||||
|
|
||||||
/** Which extensions to support. */
|
/** Which extensions to support. */
|
||||||
unsigned int rockridge :1;
|
unsigned int rockridge :1;
|
||||||
@ -192,6 +198,11 @@ struct iso_write_opts {
|
|||||||
*/
|
*/
|
||||||
unsigned int joliet_long_names :1;
|
unsigned int joliet_long_names :1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use UTF-16BE rather than its subset UCS-2
|
||||||
|
*/
|
||||||
|
unsigned int joliet_utf16 :1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write Rock Ridge info as of specification RRIP-1.10 rather than
|
* Write Rock Ridge info as of specification RRIP-1.10 rather than
|
||||||
* RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282",
|
* RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282",
|
||||||
@ -420,6 +431,7 @@ struct iso_write_opts {
|
|||||||
* See ecma119_image : System Area related information
|
* See ecma119_image : System Area related information
|
||||||
*/
|
*/
|
||||||
char *system_area_data;
|
char *system_area_data;
|
||||||
|
int system_area_size;
|
||||||
int system_area_options;
|
int system_area_options;
|
||||||
|
|
||||||
/* User settable PVD time stamps */
|
/* User settable PVD time stamps */
|
||||||
@ -502,70 +514,19 @@ struct ecma119_image
|
|||||||
IsoImage *image;
|
IsoImage *image;
|
||||||
Ecma119Node *root;
|
Ecma119Node *root;
|
||||||
|
|
||||||
int will_cancel :1;
|
IsoWriteOpts *opts;
|
||||||
|
|
||||||
unsigned int iso_level :2;
|
/** Whether El Torito data will be produced */
|
||||||
|
|
||||||
/* extensions */
|
|
||||||
unsigned int rockridge :1;
|
|
||||||
unsigned int joliet :1;
|
|
||||||
unsigned int eltorito :1;
|
unsigned int eltorito :1;
|
||||||
unsigned int iso1999 :1;
|
|
||||||
unsigned int hfsplus :1;
|
|
||||||
unsigned int fat :1;
|
|
||||||
|
|
||||||
unsigned int hardlinks:1; /* see iso_write_opts_set_hardlinks() */
|
/* The ECMA-119 directory node where to store Rock Ridge relocated
|
||||||
|
directories. (Path is in IsoWriteOpts.rr_reloc_dir)
|
||||||
unsigned int aaip :1; /* see iso_write_opts_set_aaip() */
|
|
||||||
|
|
||||||
/* allways write timestamps in GMT */
|
|
||||||
unsigned int always_gmt :1;
|
|
||||||
|
|
||||||
/* relaxed constraints */
|
|
||||||
unsigned int allow_dir_id_ext :1;
|
|
||||||
unsigned int omit_version_numbers :2;
|
|
||||||
unsigned int allow_deep_paths :1;
|
|
||||||
unsigned int allow_longer_paths :1;
|
|
||||||
unsigned int max_37_char_filenames :1;
|
|
||||||
unsigned int no_force_dots :2;
|
|
||||||
unsigned int allow_lowercase :1;
|
|
||||||
unsigned int allow_full_ascii :1;
|
|
||||||
unsigned int allow_7bit_ascii :1;
|
|
||||||
|
|
||||||
unsigned int relaxed_vol_atts : 1;
|
|
||||||
|
|
||||||
/** Allow paths on Joliet tree to be larger than 240 bytes */
|
|
||||||
unsigned int joliet_longer_paths :1;
|
|
||||||
|
|
||||||
/** Allow Joliet names up to 103 characters rather than 64 */
|
|
||||||
unsigned int joliet_long_names :1;
|
|
||||||
|
|
||||||
/** Write old fashioned RRIP-1.10 rather than RRIP-1.12 */
|
|
||||||
unsigned int rrip_version_1_10 :1;
|
|
||||||
|
|
||||||
/** Write field PX with file serial number even with RRIP-1.10 */
|
|
||||||
unsigned int rrip_1_10_px_ino :1;
|
|
||||||
|
|
||||||
/* Write AAIP as extension according to SUSP 1.10 rather than SUSP 1.12. */
|
|
||||||
unsigned int aaip_susp_1_10 :1;
|
|
||||||
|
|
||||||
/* Store in ECMA-119, Joliet, ISO 9660:1999 timestamp the mtime of source
|
|
||||||
bit0= ECMA-119, bit1= Joliet, bit2= ISO 9660:1999.
|
|
||||||
*/
|
*/
|
||||||
unsigned int dir_rec_mtime :3;
|
|
||||||
|
|
||||||
/* The ECMA-119 directory where to store Rock Ridge relocated directories.
|
|
||||||
*/
|
|
||||||
char *rr_reloc_dir; /* IsoNode name in root directory */
|
|
||||||
int rr_reloc_flags;
|
|
||||||
Ecma119Node *rr_reloc_node; /* Directory node in ecma119_image */
|
Ecma119Node *rr_reloc_node; /* Directory node in ecma119_image */
|
||||||
|
|
||||||
unsigned int md5_session_checksum :1;
|
|
||||||
unsigned int md5_file_checksums :2;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mode replace. If one of these flags is set, the correspodent values are
|
* Mode replace. If one of these flags is set, the correspodent values are
|
||||||
* replaced with values below.
|
* replaced with values below. Both get computed from IsoWriteOpts.
|
||||||
*/
|
*/
|
||||||
unsigned int replace_uid :1;
|
unsigned int replace_uid :1;
|
||||||
unsigned int replace_gid :1;
|
unsigned int replace_gid :1;
|
||||||
@ -573,30 +534,17 @@ struct ecma119_image
|
|||||||
unsigned int replace_dir_mode :1;
|
unsigned int replace_dir_mode :1;
|
||||||
unsigned int replace_timestamps :1;
|
unsigned int replace_timestamps :1;
|
||||||
|
|
||||||
|
/* Mode replacement values. */
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
gid_t gid;
|
gid_t gid;
|
||||||
mode_t file_mode;
|
mode_t file_mode;
|
||||||
mode_t dir_mode;
|
mode_t dir_mode;
|
||||||
time_t timestamp;
|
time_t timestamp;
|
||||||
|
|
||||||
unsigned int old_empty :1;
|
/* Effective charsets */
|
||||||
unsigned int untranslated_name_len;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* if sort files or not. Sorting is based of the weight of each file
|
|
||||||
*/
|
|
||||||
int sort_files;
|
|
||||||
|
|
||||||
char *input_charset;
|
char *input_charset;
|
||||||
char *output_charset;
|
char *output_charset;
|
||||||
|
|
||||||
/* See iso_write_opts and iso_write_opts_set_hfsp_serial_number().
|
|
||||||
* 00...00 means that it shall be generated by libisofs.
|
|
||||||
*/
|
|
||||||
uint8_t hfsp_serial_number[8];
|
|
||||||
|
|
||||||
unsigned int appendable : 1;
|
|
||||||
uint32_t ms_block; /**< start block for a ms image */
|
|
||||||
time_t now; /**< Time at which writing began. */
|
time_t now; /**< Time at which writing began. */
|
||||||
|
|
||||||
/** Total size of the output. This only includes the current volume. */
|
/** Total size of the output. This only includes the current volume. */
|
||||||
@ -642,6 +590,7 @@ struct ecma119_image
|
|||||||
uint32_t joliet_path_table_size;
|
uint32_t joliet_path_table_size;
|
||||||
uint32_t joliet_l_path_table_pos;
|
uint32_t joliet_l_path_table_pos;
|
||||||
uint32_t joliet_m_path_table_pos;
|
uint32_t joliet_m_path_table_pos;
|
||||||
|
size_t joliet_ucs2_failures;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* HFS+ related information
|
* HFS+ related information
|
||||||
@ -713,6 +662,15 @@ struct ecma119_image
|
|||||||
* 0 = auto (align if bit1)
|
* 0 = auto (align if bit1)
|
||||||
* 1 = always align to cylinder boundary
|
* 1 = always align to cylinder boundary
|
||||||
* 2 = never align to cylinder boundary
|
* 2 = never align to cylinder boundary
|
||||||
|
* 3 = always align, additionally pad up and align partitions
|
||||||
|
* which were appended by iso_write_opts_set_partition_img()
|
||||||
|
* bit10-13= System area sub type
|
||||||
|
* With type 0 = MBR:
|
||||||
|
* Gets overridden by bit0 and bit1.
|
||||||
|
* 0 = no particular sub type
|
||||||
|
* 1 = CHRP: A single MBR partition of type 0x96 covers the
|
||||||
|
* ISO image. Not compatible with any other feature
|
||||||
|
* which needs to have own MBR partition entries.
|
||||||
*/
|
*/
|
||||||
int system_area_options;
|
int system_area_options;
|
||||||
|
|
||||||
@ -754,14 +712,6 @@ struct ecma119_image
|
|||||||
Use only underneath ecma119_image_new()
|
Use only underneath ecma119_image_new()
|
||||||
and if not NULL*/
|
and if not NULL*/
|
||||||
|
|
||||||
/* ??? Is there a reason why we copy lots of items from IsoWriteOpts
|
|
||||||
rather than taking ownership of the IsoWriteOpts object which
|
|
||||||
is submitted with ecma119_image_new() ?
|
|
||||||
*/
|
|
||||||
|
|
||||||
char scdbackup_tag_parm[100];
|
|
||||||
char *scdbackup_tag_written;
|
|
||||||
|
|
||||||
/* Buffer for communication between burn_source and writer thread */
|
/* Buffer for communication between burn_source and writer thread */
|
||||||
IsoRingBuffer *buffer;
|
IsoRingBuffer *buffer;
|
||||||
|
|
||||||
@ -770,20 +720,7 @@ struct ecma119_image
|
|||||||
int wthread_is_running;
|
int wthread_is_running;
|
||||||
pthread_attr_t th_attr;
|
pthread_attr_t th_attr;
|
||||||
|
|
||||||
/* User settable PVD time stamps */
|
/* Effective partition table parameter: 1 to 63, 0= disabled/default */
|
||||||
time_t vol_creation_time;
|
|
||||||
time_t vol_modification_time;
|
|
||||||
time_t vol_expiration_time;
|
|
||||||
time_t vol_effective_time;
|
|
||||||
/* To eventually override vol_creation_time and vol_modification_time
|
|
||||||
* by unconverted string with timezone 0
|
|
||||||
*/
|
|
||||||
char vol_uuid[17];
|
|
||||||
|
|
||||||
/* The number of unclaimed 2K blocks before
|
|
||||||
start of partition 1 as of the MBR in system area. */
|
|
||||||
uint32_t partition_offset;
|
|
||||||
/* Partition table parameter: 1 to 63, 0= disabled/default */
|
|
||||||
int partition_secs_per_head;
|
int partition_secs_per_head;
|
||||||
/* 1 to 255, 0= disabled/default */
|
/* 1 to 255, 0= disabled/default */
|
||||||
int partition_heads_per_cyl;
|
int partition_heads_per_cyl;
|
||||||
@ -804,27 +741,22 @@ struct ecma119_image
|
|||||||
uint32_t j_part_l_path_table_pos;
|
uint32_t j_part_l_path_table_pos;
|
||||||
uint32_t j_part_m_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 */
|
/* Memorized ELF parameters from MIPS Little Endian boot file */
|
||||||
uint32_t mipsel_e_entry;
|
uint32_t mipsel_e_entry;
|
||||||
uint32_t mipsel_p_offset;
|
uint32_t mipsel_p_offset;
|
||||||
uint32_t mipsel_p_vaddr;
|
uint32_t mipsel_p_vaddr;
|
||||||
uint32_t mipsel_p_filesz;
|
uint32_t mipsel_p_filesz;
|
||||||
|
|
||||||
char *appended_partitions[ISO_MAX_PARTITIONS];
|
/* A data file of which the position and size shall be written after
|
||||||
uint8_t appended_part_types[ISO_MAX_PARTITIONS];
|
a SUN Disk Label.
|
||||||
|
*/
|
||||||
|
IsoFileSrc *sparc_core_src;
|
||||||
|
|
||||||
/* Counted in blocks of 2048 */
|
/* Counted in blocks of 2048 */
|
||||||
uint32_t appended_part_prepad[ISO_MAX_PARTITIONS];
|
uint32_t appended_part_prepad[ISO_MAX_PARTITIONS];
|
||||||
uint32_t appended_part_start[ISO_MAX_PARTITIONS];
|
uint32_t appended_part_start[ISO_MAX_PARTITIONS];
|
||||||
uint32_t appended_part_size[ISO_MAX_PARTITIONS];
|
uint32_t appended_part_size[ISO_MAX_PARTITIONS];
|
||||||
|
|
||||||
char ascii_disc_label[ISO_DISC_LABEL_SIZE];
|
|
||||||
|
|
||||||
/* See IsoImage and libisofs.h */
|
/* See IsoImage and libisofs.h */
|
||||||
IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
|
IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
|
||||||
|
|
||||||
@ -832,15 +764,10 @@ struct ecma119_image
|
|||||||
Only change a block size if it is 0. Set only to 512 or 2048.
|
Only change a block size if it is 0. Set only to 512 or 2048.
|
||||||
If it stays 0 then it will become 512 or 2048 in time.
|
If it stays 0 then it will become 512 or 2048 in time.
|
||||||
*/
|
*/
|
||||||
/* Blocksize of Apple Partition Map
|
|
||||||
May be defined to 512 or 2048 before writer thread starts.
|
|
||||||
*/
|
|
||||||
int apm_block_size;
|
|
||||||
|
|
||||||
/* Allocation block size of HFS+
|
/* Allocation block size of HFS+
|
||||||
May be defined to 512 or 2048 before hfsplus_writer_create().
|
May be defined to 512 or 2048 before hfsplus_writer_create().
|
||||||
*/
|
*/
|
||||||
int hfsp_block_size;
|
|
||||||
int hfsp_cat_node_size; /* 2 * apm_block_size */
|
int hfsp_cat_node_size; /* 2 * apm_block_size */
|
||||||
int hfsp_iso_block_fac; /* 2048 / apm_block_size */
|
int hfsp_iso_block_fac; /* 2048 / apm_block_size */
|
||||||
|
|
||||||
@ -863,7 +790,6 @@ struct ecma119_image
|
|||||||
struct iso_mbr_partition_request *mbr_req[ISO_MBR_ENTRIES_MAX];
|
struct iso_mbr_partition_request *mbr_req[ISO_MBR_ENTRIES_MAX];
|
||||||
int mbr_req_count;
|
int mbr_req_count;
|
||||||
|
|
||||||
char *prep_partition;
|
|
||||||
uint32_t prep_part_size;
|
uint32_t prep_part_size;
|
||||||
|
|
||||||
/* GPT description. To be composed during IsoImageWriter
|
/* GPT description. To be composed during IsoImageWriter
|
||||||
@ -876,7 +802,6 @@ struct ecma119_image
|
|||||||
/* bit0= GPT partitions may overlap */
|
/* bit0= GPT partitions may overlap */
|
||||||
int gpt_req_flags;
|
int gpt_req_flags;
|
||||||
|
|
||||||
char *efi_boot_partition;
|
|
||||||
uint32_t efi_boot_part_size;
|
uint32_t efi_boot_part_size;
|
||||||
IsoFileSrc *efi_boot_part_filesrc; /* Just a pointer. Do not free. */
|
IsoFileSrc *efi_boot_part_filesrc; /* Just a pointer. Do not free. */
|
||||||
|
|
||||||
@ -1040,4 +965,7 @@ void ecma119_set_voldescr_times(IsoImageWriter *writer,
|
|||||||
int iso_write_partition_file(Ecma119Image *target, char *path,
|
int iso_write_partition_file(Ecma119Image *target, char *path,
|
||||||
uint32_t prepad, uint32_t blocks, int flag);
|
uint32_t prepad, uint32_t blocks, int flag);
|
||||||
|
|
||||||
|
void issue_ucs2_warning_summary(size_t failures);
|
||||||
|
|
||||||
|
|
||||||
#endif /*LIBISO_ECMA119_H_*/
|
#endif /*LIBISO_ECMA119_H_*/
|
||||||
|
@ -29,52 +29,57 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static
|
/* @param flag bit0= Do not issue error messages
|
||||||
int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
*/
|
||||||
|
int iso_get_ecma119_name(IsoWriteOpts *opts, char *input_charset, int imgid,
|
||||||
|
char *node_name, enum IsoNodeType node_type,
|
||||||
|
char **name, int flag)
|
||||||
{
|
{
|
||||||
int ret, relaxed, free_ascii_name= 0, force_dots = 0;
|
int ret, relaxed, free_ascii_name = 0, force_dots = 0;
|
||||||
char *ascii_name;
|
char *ascii_name;
|
||||||
char *isoname= NULL;
|
char *isoname = NULL;
|
||||||
|
|
||||||
if (iso->name == NULL) {
|
if (node_name == NULL) {
|
||||||
/* it is not necessarily an error, it can be the root */
|
/* it is not necessarily an error, it can be the root */
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (img->untranslated_name_len > 0) {
|
if (opts->untranslated_name_len > 0) {
|
||||||
ascii_name = iso->name;
|
ascii_name = node_name;
|
||||||
ret = 1;
|
ret = 1;
|
||||||
} else {
|
} else {
|
||||||
ret = str2ascii(img->input_charset, iso->name, &ascii_name);
|
ret = str2ascii(input_charset, node_name, &ascii_name);
|
||||||
free_ascii_name = 1;
|
free_ascii_name = 1;
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
iso_msg_submit(img->image->id, ret, 0,
|
if (!(flag & 512))
|
||||||
"Cannot convert name '%s' to ASCII", iso->name);
|
iso_msg_submit(imgid, ret, 0,
|
||||||
|
"Cannot convert name '%s' to ASCII", node_name);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (img->allow_full_ascii) {
|
if (opts->allow_full_ascii) {
|
||||||
relaxed = 2;
|
relaxed = 2;
|
||||||
} else {
|
} else {
|
||||||
relaxed = (int)img->allow_lowercase;
|
relaxed = (int)opts->allow_lowercase;
|
||||||
}
|
}
|
||||||
if (img->allow_7bit_ascii)
|
if (opts->allow_7bit_ascii)
|
||||||
relaxed |= 4;
|
relaxed |= 4;
|
||||||
if (iso->type == LIBISO_DIR && !(img->allow_dir_id_ext)) {
|
if (node_type == LIBISO_DIR && !(opts->allow_dir_id_ext)) {
|
||||||
if (img->untranslated_name_len > 0) {
|
if (opts->untranslated_name_len > 0) {
|
||||||
if (strlen(ascii_name) > img->untranslated_name_len) {
|
if (strlen(ascii_name) > opts->untranslated_name_len) {
|
||||||
needs_transl:;
|
needs_transl:;
|
||||||
iso_msg_submit(img->image->id, ISO_NAME_NEEDS_TRANSL, 0,
|
if (!(flag & 512))
|
||||||
|
iso_msg_submit(imgid, ISO_NAME_NEEDS_TRANSL, 0,
|
||||||
"File name too long (%d > %d) for untranslated recording: '%s'",
|
"File name too long (%d > %d) for untranslated recording: '%s'",
|
||||||
strlen(ascii_name), img->untranslated_name_len,
|
strlen(ascii_name), opts->untranslated_name_len,
|
||||||
ascii_name);
|
ascii_name);
|
||||||
return ISO_NAME_NEEDS_TRANSL;
|
return ISO_NAME_NEEDS_TRANSL;
|
||||||
}
|
}
|
||||||
isoname = strdup(ascii_name);
|
isoname = strdup(ascii_name);
|
||||||
} else if (img->max_37_char_filenames) {
|
} else if (opts->max_37_char_filenames) {
|
||||||
isoname = iso_r_dirid(ascii_name, 37, relaxed);
|
isoname = iso_r_dirid(ascii_name, 37, relaxed);
|
||||||
} else if (img->iso_level == 1) {
|
} else if (opts->iso_level == 1) {
|
||||||
|
|
||||||
#ifdef Libisofs_old_ecma119_nameS
|
#ifdef Libisofs_old_ecma119_nameS
|
||||||
|
|
||||||
@ -99,14 +104,15 @@ needs_transl:;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
force_dots = !((img->no_force_dots & 1) || iso->type == LIBISO_DIR);
|
force_dots = !((opts->no_force_dots & 1) ||
|
||||||
if (img->untranslated_name_len > 0) {
|
node_type == LIBISO_DIR);
|
||||||
if (strlen(ascii_name) > img->untranslated_name_len)
|
if (opts->untranslated_name_len > 0) {
|
||||||
|
if (strlen(ascii_name) > opts->untranslated_name_len)
|
||||||
goto needs_transl;
|
goto needs_transl;
|
||||||
isoname = strdup(ascii_name);
|
isoname = strdup(ascii_name);
|
||||||
} else if (img->max_37_char_filenames) {
|
} else if (opts->max_37_char_filenames) {
|
||||||
isoname = iso_r_fileid(ascii_name, 36, relaxed, force_dots);
|
isoname = iso_r_fileid(ascii_name, 36, relaxed, force_dots);
|
||||||
} else if (img->iso_level == 1) {
|
} else if (opts->iso_level == 1) {
|
||||||
|
|
||||||
#ifdef Libisofs_old_ecma119_nameS
|
#ifdef Libisofs_old_ecma119_nameS
|
||||||
|
|
||||||
@ -151,11 +157,21 @@ needs_transl:;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = iso_get_ecma119_name(img->opts, img->input_charset, img->image->id,
|
||||||
|
iso->name, iso->type, name, 0);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int ecma119_is_dedicated_reloc_dir(Ecma119Image *img, Ecma119Node *node)
|
int ecma119_is_dedicated_reloc_dir(Ecma119Image *img, Ecma119Node *node)
|
||||||
{
|
{
|
||||||
if (img->rr_reloc_node == node &&
|
if (img->rr_reloc_node == node &&
|
||||||
node != img->root && node != img->partition_root &&
|
node != img->root && node != img->partition_root &&
|
||||||
(img->rr_reloc_flags & 2))
|
(img->opts->rr_reloc_flags & 2))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -220,7 +236,7 @@ int create_file_src(Ecma119Image *img, IsoFile *iso, IsoFileSrc **src)
|
|||||||
off_t size;
|
off_t size;
|
||||||
|
|
||||||
size = iso_stream_get_size(iso->stream);
|
size = iso_stream_get_size(iso->stream);
|
||||||
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && img->iso_level != 3) {
|
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && img->opts->iso_level != 3) {
|
||||||
char *ipath = iso_tree_get_node_path(ISO_NODE(iso));
|
char *ipath = iso_tree_get_node_path(ISO_NODE(iso));
|
||||||
ret = iso_msg_submit(img->image->id, ISO_FILE_TOO_BIG, 0,
|
ret = iso_msg_submit(img->image->id, ISO_FILE_TOO_BIG, 0,
|
||||||
"File \"%s\" can't be added to image because "
|
"File \"%s\" can't be added to image because "
|
||||||
@ -361,6 +377,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
int max_path;
|
int max_path;
|
||||||
char *iso_name= NULL, *ipath = NULL;
|
char *iso_name= NULL, *ipath = NULL;
|
||||||
IsoFileSrc *src = NULL;
|
IsoFileSrc *src = NULL;
|
||||||
|
IsoWriteOpts *opts = image->opts;
|
||||||
|
|
||||||
if (image == NULL || iso == NULL || tree == NULL) {
|
if (image == NULL || iso == NULL || tree == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
@ -385,16 +402,16 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0);
|
max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0);
|
||||||
if (!image->rockridge) {
|
if (!opts->rockridge) {
|
||||||
if ((iso->type == LIBISO_DIR && depth > 8) &&
|
if ((iso->type == LIBISO_DIR && depth > 8) &&
|
||||||
!image->allow_deep_paths) {
|
!opts->allow_deep_paths) {
|
||||||
ipath = iso_tree_get_node_path(iso);
|
ipath = iso_tree_get_node_path(iso);
|
||||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
||||||
0, "File \"%s\" can't be added, "
|
0, "File \"%s\" can't be added, "
|
||||||
"because directory depth "
|
"because directory depth "
|
||||||
"is greater than 8.", ipath);
|
"is greater than 8.", ipath);
|
||||||
goto ex;
|
goto ex;
|
||||||
} else if (max_path > 255 && !image->allow_longer_paths) {
|
} else if (max_path > 255 && !opts->allow_longer_paths) {
|
||||||
ipath = iso_tree_get_node_path(iso);
|
ipath = iso_tree_get_node_path(iso);
|
||||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
|
||||||
0, "File \"%s\" can't be added, "
|
0, "File \"%s\" can't be added, "
|
||||||
@ -418,7 +435,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
ret = 0; /* Hidden means non-existing */
|
ret = 0; /* Hidden means non-existing */
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
if (image->rockridge) {
|
if (opts->rockridge) {
|
||||||
ret = create_symlink(image, (IsoSymlink*)iso, &node);
|
ret = create_symlink(image, (IsoSymlink*)iso, &node);
|
||||||
} else {
|
} else {
|
||||||
/* symlinks are only supported when RR is enabled */
|
/* symlinks are only supported when RR is enabled */
|
||||||
@ -434,7 +451,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
ret = 0; /* Hidden means non-existing */
|
ret = 0; /* Hidden means non-existing */
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
if (image->rockridge) {
|
if (opts->rockridge) {
|
||||||
ret = create_special(image, (IsoSpecial*)iso, &node);
|
ret = create_special(image, (IsoSpecial*)iso, &node);
|
||||||
} else {
|
} else {
|
||||||
/* special files are only supported when RR is enabled */
|
/* special files are only supported when RR is enabled */
|
||||||
@ -472,9 +489,9 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
image->rr_reloc_node = node;
|
image->rr_reloc_node = node;
|
||||||
} else if (depth == 2) {
|
} else if (depth == 2) {
|
||||||
/* Directories in root may be used as relocation dir */
|
/* Directories in root may be used as relocation dir */
|
||||||
if (image->rr_reloc_dir != NULL)
|
if (opts->rr_reloc_dir != NULL)
|
||||||
if (image->rr_reloc_dir[0] != 0 &&
|
if (opts->rr_reloc_dir[0] != 0 &&
|
||||||
strcmp(iso->name, image->rr_reloc_dir) == 0)
|
strcmp(iso->name, opts->rr_reloc_dir) == 0)
|
||||||
image->rr_reloc_node = node;
|
image->rr_reloc_node = node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -606,7 +623,7 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (img->untranslated_name_len) {
|
if (img->opts->untranslated_name_len) {
|
||||||
/* This should not happen because no two IsoNode names should be
|
/* This should not happen because no two IsoNode names should be
|
||||||
identical and only unaltered IsoNode names should be seen here.
|
identical and only unaltered IsoNode names should be seen here.
|
||||||
Thus the Ema119Node names should be unique.
|
Thus the Ema119Node names should be unique.
|
||||||
@ -635,7 +652,8 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
/* compute name and extension */
|
/* compute name and extension */
|
||||||
dot = strrchr(full_name, '.');
|
dot = strrchr(full_name, '.');
|
||||||
if (dot != NULL &&
|
if (dot != NULL &&
|
||||||
(children[i]->type != ECMA119_DIR || img->allow_dir_id_ext)) {
|
(children[i]->type != ECMA119_DIR ||
|
||||||
|
img->opts->allow_dir_id_ext)) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* File (normally not dir) with extension
|
* File (normally not dir) with extension
|
||||||
@ -801,11 +819,11 @@ int mangle_tree(Ecma119Image *img, Ecma119Node *dir, int recurse)
|
|||||||
int max_file, max_dir;
|
int max_file, max_dir;
|
||||||
Ecma119Node *root;
|
Ecma119Node *root;
|
||||||
|
|
||||||
if (img->untranslated_name_len > 0) {
|
if (img->opts->untranslated_name_len > 0) {
|
||||||
max_file = max_dir = img->untranslated_name_len;
|
max_file = max_dir = img->opts->untranslated_name_len;
|
||||||
} else if (img->max_37_char_filenames) {
|
} else if (img->opts->max_37_char_filenames) {
|
||||||
max_file = max_dir = 37;
|
max_file = max_dir = 37;
|
||||||
} else if (img->iso_level == 1) {
|
} else if (img->opts->iso_level == 1) {
|
||||||
max_file = 12; /* 8 + 3 + 1 */
|
max_file = 12; /* 8 + 3 + 1 */
|
||||||
max_dir = 8;
|
max_dir = 8;
|
||||||
} else {
|
} else {
|
||||||
@ -973,9 +991,9 @@ int reorder_tree(Ecma119Image *img, Ecma119Node *dir,
|
|||||||
/* dir is now the relocated Ecma119Node */
|
/* dir is now the relocated Ecma119Node */
|
||||||
pathlen = 37 + 1; /* The dir name might get longer by mangling */
|
pathlen = 37 + 1; /* The dir name might get longer by mangling */
|
||||||
level = 2;
|
level = 2;
|
||||||
if (img->rr_reloc_dir != NULL) {
|
if (img->opts->rr_reloc_dir != NULL) {
|
||||||
pathlen += strlen(img->rr_reloc_node->iso_name) + 1;
|
pathlen += strlen(img->rr_reloc_node->iso_name) + 1;
|
||||||
if(img->rr_reloc_dir[0] != 0)
|
if(img->opts->rr_reloc_dir[0] != 0)
|
||||||
level = 3;
|
level = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1128,7 +1146,7 @@ int match_hardlinks(Ecma119Image *img, Ecma119Node *dir, int flag)
|
|||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
/* Sort according to id tuples, IsoFileSrc identity, properties, xattr. */
|
/* Sort according to id tuples, IsoFileSrc identity, properties, xattr. */
|
||||||
if (img->hardlinks)
|
if (img->opts->hardlinks)
|
||||||
qsort(nodes, node_count, sizeof(Ecma119Node *), ecma119_node_cmp_hard);
|
qsort(nodes, node_count, sizeof(Ecma119Node *), ecma119_node_cmp_hard);
|
||||||
else
|
else
|
||||||
qsort(nodes, node_count, sizeof(Ecma119Node *),
|
qsort(nodes, node_count, sizeof(Ecma119Node *),
|
||||||
@ -1198,7 +1216,7 @@ int ecma119_tree_create(Ecma119Image *img)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (img->rockridge && !img->allow_deep_paths) {
|
if (img->opts->rockridge && !img->opts->allow_deep_paths) {
|
||||||
|
|
||||||
/* Relocate deep directories, acording to RRIP, 4.1.5 */
|
/* Relocate deep directories, acording to RRIP, 4.1.5 */
|
||||||
ret = reorder_tree(img, root, 1, 0);
|
ret = reorder_tree(img, root, 1, 0);
|
||||||
|
@ -103,5 +103,13 @@ Ecma119Node *ecma119_search_iso_node(Ecma119Image *img, IsoNode *node);
|
|||||||
*/
|
*/
|
||||||
int ecma119_is_dedicated_reloc_dir(Ecma119Image *img, Ecma119Node *node);
|
int ecma119_is_dedicated_reloc_dir(Ecma119Image *img, Ecma119Node *node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the ECMA-119 name from node name.
|
||||||
|
* @param flag bit0= Do not issue error messages
|
||||||
|
*/
|
||||||
|
int iso_get_ecma119_name(IsoWriteOpts *opts, char *input_charset, int imgid,
|
||||||
|
char *node_name, enum IsoNodeType node_type,
|
||||||
|
char **name, int flag);
|
||||||
|
|
||||||
|
|
||||||
#endif /*LIBISO_ECMA119_TREE_H_*/
|
#endif /*LIBISO_ECMA119_TREE_H_*/
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2010 Thomas Schmitt
|
* Copyright (c) 2010 - 2013 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -160,7 +160,13 @@ int el_torito_get_selection_crit(ElToritoBootImage *bootimg, uint8_t crit[20])
|
|||||||
/* API */
|
/* API */
|
||||||
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag)
|
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag)
|
||||||
{
|
{
|
||||||
return bootimg->seems_boot_info_table;
|
switch (flag & 15) {
|
||||||
|
case 0:
|
||||||
|
return bootimg->seems_boot_info_table;
|
||||||
|
case 1:
|
||||||
|
return bootimg->seems_grub2_boot_info;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -197,14 +203,14 @@ void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg)
|
|||||||
*/
|
*/
|
||||||
int el_torito_set_isolinux_options(ElToritoBootImage *bootimg, int options, int flag)
|
int el_torito_set_isolinux_options(ElToritoBootImage *bootimg, int options, int flag)
|
||||||
{
|
{
|
||||||
bootimg->isolinux_options = (options & 0x01ff);
|
bootimg->isolinux_options = (options & 0x03ff);
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API */
|
/* API */
|
||||||
int el_torito_get_isolinux_options(ElToritoBootImage *bootimg, int flag)
|
int el_torito_get_isolinux_options(ElToritoBootImage *bootimg, int flag)
|
||||||
{
|
{
|
||||||
return bootimg->isolinux_options & 0x01ff;
|
return bootimg->isolinux_options & 0x03ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* API */
|
/* API */
|
||||||
@ -306,7 +312,8 @@ int iso_tree_add_boot_node(IsoDir *parent, const char *name, IsoBoot **boot)
|
|||||||
static
|
static
|
||||||
int create_image(IsoImage *image, const char *image_path,
|
int create_image(IsoImage *image, const char *image_path,
|
||||||
enum eltorito_boot_media_type type,
|
enum eltorito_boot_media_type type,
|
||||||
struct el_torito_boot_image **bootimg)
|
struct el_torito_boot_image **bootimg,
|
||||||
|
IsoFile **bootnode)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct el_torito_boot_image *boot;
|
struct el_torito_boot_image *boot;
|
||||||
@ -317,6 +324,7 @@ int create_image(IsoImage *image, const char *image_path,
|
|||||||
IsoNode *imgfile;
|
IsoNode *imgfile;
|
||||||
IsoStream *stream;
|
IsoStream *stream;
|
||||||
|
|
||||||
|
*bootnode = NULL;
|
||||||
ret = iso_tree_path_to_node(image, image_path, &imgfile);
|
ret = iso_tree_path_to_node(image, image_path, &imgfile);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
@ -331,6 +339,7 @@ int create_image(IsoImage *image, const char *image_path,
|
|||||||
if (imgfile->type != LIBISO_FILE) {
|
if (imgfile->type != LIBISO_FILE) {
|
||||||
return ISO_BOOT_IMAGE_NOT_VALID;
|
return ISO_BOOT_IMAGE_NOT_VALID;
|
||||||
}
|
}
|
||||||
|
*bootnode = (IsoFile *) imgfile;
|
||||||
|
|
||||||
stream = ((IsoFile*)imgfile)->stream;
|
stream = ((IsoFile*)imgfile)->stream;
|
||||||
|
|
||||||
@ -455,6 +464,7 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
|||||||
struct el_torito_boot_catalog *catalog;
|
struct el_torito_boot_catalog *catalog;
|
||||||
ElToritoBootImage *boot_image= NULL;
|
ElToritoBootImage *boot_image= NULL;
|
||||||
IsoBoot *cat_node= NULL;
|
IsoBoot *cat_node= NULL;
|
||||||
|
IsoFile *boot_node;
|
||||||
|
|
||||||
if (image == NULL || image_path == NULL || catalog_path == NULL) {
|
if (image == NULL || image_path == NULL || catalog_path == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
@ -507,7 +517,7 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* create the boot image */
|
/* create the boot image */
|
||||||
ret = create_image(image, image_path, type, &boot_image);
|
ret = create_image(image, image_path, type, &boot_image, &boot_node);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto boot_image_cleanup;
|
goto boot_image_cleanup;
|
||||||
}
|
}
|
||||||
@ -524,6 +534,8 @@ int iso_image_set_boot_image(IsoImage *image, const char *image_path,
|
|||||||
catalog->bootimages[i] = NULL;
|
catalog->bootimages[i] = NULL;
|
||||||
catalog->node = cat_node;
|
catalog->node = cat_node;
|
||||||
catalog->sort_weight = 1000; /* slightly high */
|
catalog->sort_weight = 1000; /* slightly high */
|
||||||
|
if (!boot_node->explicit_weight)
|
||||||
|
boot_node->sort_weight = 2;
|
||||||
iso_node_ref((IsoNode*)cat_node);
|
iso_node_ref((IsoNode*)cat_node);
|
||||||
image->bootcat = catalog;
|
image->bootcat = catalog;
|
||||||
|
|
||||||
@ -694,14 +706,17 @@ int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
|||||||
int ret;
|
int ret;
|
||||||
struct el_torito_boot_catalog *catalog = image->bootcat;
|
struct el_torito_boot_catalog *catalog = image->bootcat;
|
||||||
ElToritoBootImage *boot_img;
|
ElToritoBootImage *boot_img;
|
||||||
|
IsoFile *boot_node;
|
||||||
|
|
||||||
if(catalog == NULL)
|
if(catalog == NULL)
|
||||||
return ISO_BOOT_NO_CATALOG;
|
return ISO_BOOT_NO_CATALOG;
|
||||||
if (catalog->num_bootimages >= Libisofs_max_boot_imageS)
|
if (catalog->num_bootimages >= Libisofs_max_boot_imageS)
|
||||||
return ISO_BOOT_IMAGE_OVERFLOW;
|
return ISO_BOOT_IMAGE_OVERFLOW;
|
||||||
ret = create_image(image, image_path, type, &boot_img);
|
ret = create_image(image, image_path, type, &boot_img, &boot_node);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
if (!boot_node->explicit_weight)
|
||||||
|
boot_node->sort_weight = 2;
|
||||||
catalog->bootimages[catalog->num_bootimages] = boot_img;
|
catalog->bootimages[catalog->num_bootimages] = boot_img;
|
||||||
catalog->num_bootimages++;
|
catalog->num_bootimages++;
|
||||||
if (boot != NULL)
|
if (boot != NULL)
|
||||||
@ -1096,7 +1111,7 @@ int make_boot_info_table(uint8_t *buf, uint32_t pvd_lba,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Patch an isolinux boot image.
|
* Patch an El Torito boot image by a boot info table.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* 1 on success, 0 error (but continue), < 0 error
|
* 1 on success, 0 error (but continue), < 0 error
|
||||||
@ -1111,12 +1126,33 @@ int patch_boot_info_table(uint8_t *buf, Ecma119Image *t,
|
|||||||
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
|
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
|
||||||
"Isolinux image too small. We won't patch it.");
|
"Isolinux image too small. We won't patch it.");
|
||||||
}
|
}
|
||||||
ret = make_boot_info_table(buf, t->ms_block + (uint32_t) 16,
|
ret = make_boot_info_table(buf, t->opts->ms_block + (uint32_t) 16,
|
||||||
t->bootsrc[idx]->sections[0].block,
|
t->bootsrc[idx]->sections[0].block,
|
||||||
(uint32_t) imgsize);
|
(uint32_t) imgsize);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch a GRUB2 El Torito boot image.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
int patch_grub2_boot_image(uint8_t *buf, Ecma119Image *t,
|
||||||
|
size_t imgsize, int idx,
|
||||||
|
size_t pos, int offst)
|
||||||
|
{
|
||||||
|
uint64_t blk;
|
||||||
|
|
||||||
|
if (imgsize < pos + 8)
|
||||||
|
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
|
||||||
|
"Isolinux image too small for GRUB2. Will not patch it.");
|
||||||
|
blk = ((uint64_t) t->bootsrc[idx]->sections[0].block) * 4 + offst;
|
||||||
|
iso_lsb((buf + pos), blk & 0xffffffff, 4);
|
||||||
|
iso_lsb((buf + pos + 4), blk >> 32, 4);
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Patch the boot images if indicated */
|
/* Patch the boot images if indicated */
|
||||||
int iso_patch_eltoritos(Ecma119Image *t)
|
int iso_patch_eltoritos(Ecma119Image *t)
|
||||||
{
|
{
|
||||||
@ -1130,7 +1166,7 @@ int iso_patch_eltoritos(Ecma119Image *t)
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
|
||||||
for (idx = 0; idx < t->catalog->num_bootimages; idx++) {
|
for (idx = 0; idx < t->catalog->num_bootimages; idx++) {
|
||||||
if (!(t->catalog->bootimages[idx]->isolinux_options & 0x01))
|
if (!(t->catalog->bootimages[idx]->isolinux_options & 0x201))
|
||||||
continue;
|
continue;
|
||||||
original = t->bootsrc[idx]->stream;
|
original = t->bootsrc[idx]->stream;
|
||||||
size = (size_t) iso_stream_get_size(original);
|
size = (size_t) iso_stream_get_size(original);
|
||||||
@ -1154,9 +1190,20 @@ int iso_patch_eltoritos(Ecma119Image *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ok, patch the read buffer */
|
/* ok, patch the read buffer */
|
||||||
ret = patch_boot_info_table(buf, t, size, idx);
|
if (t->catalog->bootimages[idx]->isolinux_options & 0x200) {
|
||||||
if (ret < 0) {
|
/* GRUB2 boot provisions */
|
||||||
return ret;
|
ret = patch_grub2_boot_image(buf, t, size, idx,
|
||||||
|
Libisofs_grub2_elto_patch_poS,
|
||||||
|
Libisofs_grub2_elto_patch_offsT);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
/* Must be done as last patching */
|
||||||
|
if (t->catalog->bootimages[idx]->isolinux_options & 0x01) {
|
||||||
|
/* Boot Info Table */
|
||||||
|
ret = patch_boot_info_table(buf, t, size, idx);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* replace the original stream with a memory stream that reads from
|
/* replace the original stream with a memory stream that reads from
|
||||||
@ -1255,8 +1302,8 @@ int eltorito_writer_create(Ecma119Image *target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target->efi_boot_partition != NULL)
|
if (target->opts->efi_boot_partition != NULL)
|
||||||
if (strcmp(target->efi_boot_partition, "--efi-boot-image") == 0)
|
if (strcmp(target->opts->efi_boot_partition, "--efi-boot-image") == 0)
|
||||||
outsource_efi = 1;
|
outsource_efi = 1;
|
||||||
for (idx = 0; idx < target->catalog->num_bootimages; idx++) {
|
for (idx = 0; idx < target->catalog->num_bootimages; idx++) {
|
||||||
bootimg = target->catalog->bootimages[idx]->image;
|
bootimg = target->catalog->bootimages[idx]->image;
|
||||||
@ -1290,8 +1337,8 @@ int eltorito_writer_create(Ecma119Image *target)
|
|||||||
|
|
||||||
if (outsource_efi) {
|
if (outsource_efi) {
|
||||||
/* Disable EFI Boot partition and complain */
|
/* Disable EFI Boot partition and complain */
|
||||||
free(target->efi_boot_partition);
|
free(target->opts->efi_boot_partition);
|
||||||
target->efi_boot_partition = NULL;
|
target->opts->efi_boot_partition = NULL;
|
||||||
iso_msg_submit(target->image->id, ISO_BOOT_NO_EFI_ELTO, 0,
|
iso_msg_submit(target->image->id, ISO_BOOT_NO_EFI_ELTO, 0,
|
||||||
"No newly added El Torito EFI boot image found for exposure as GPT partition");
|
"No newly added El Torito EFI boot image found for exposure as GPT partition");
|
||||||
return ISO_BOOT_NO_EFI_ELTO;
|
return ISO_BOOT_NO_EFI_ELTO;
|
||||||
|
@ -58,6 +58,7 @@ struct el_torito_boot_image {
|
|||||||
* Whether the boot image seems to contain a boot_info_table
|
* Whether the boot image seems to contain a boot_info_table
|
||||||
*/
|
*/
|
||||||
unsigned int seems_boot_info_table:1;
|
unsigned int seems_boot_info_table:1;
|
||||||
|
unsigned int seems_grub2_boot_info:1;
|
||||||
/**
|
/**
|
||||||
* isolinux options
|
* isolinux options
|
||||||
* bit 0 -> whether to patch image
|
* bit 0 -> whether to patch image
|
||||||
@ -155,4 +156,12 @@ int make_boot_info_table(uint8_t *buf, uint32_t pvd_lba,
|
|||||||
*/
|
*/
|
||||||
int iso_patch_eltoritos(Ecma119Image *t);
|
int iso_patch_eltoritos(Ecma119Image *t);
|
||||||
|
|
||||||
|
|
||||||
|
/* Parameters for patch_grub2_boot_image()
|
||||||
|
Might later become variables in struct el_torito_boot_image.
|
||||||
|
*/
|
||||||
|
#define Libisofs_grub2_elto_patch_poS (512 * 5 - 12)
|
||||||
|
#define Libisofs_grub2_elto_patch_offsT 5
|
||||||
|
|
||||||
|
|
||||||
#endif /* LIBISO_ELTORITO_H */
|
#endif /* LIBISO_ELTORITO_H */
|
||||||
|
@ -88,8 +88,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* fill key and other atts */
|
/* fill key and other atts */
|
||||||
fsrc->no_write = (file->from_old_session && img->appendable);
|
fsrc->no_write = (file->from_old_session && img->opts->appendable);
|
||||||
if (file->from_old_session && img->appendable) {
|
if (file->from_old_session && img->opts->appendable) {
|
||||||
/*
|
/*
|
||||||
* On multisession discs we keep file sections from old image.
|
* On multisession discs we keep file sections from old image.
|
||||||
*/
|
*/
|
||||||
@ -127,7 +127,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
/* insert the filesrc in the tree */
|
/* insert the filesrc in the tree */
|
||||||
ret = iso_rbtree_insert(img->files, fsrc, (void**)src);
|
ret = iso_rbtree_insert(img->files, fsrc, (void**)src);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
if (ret == 0 && (*src)->checksum_index > 0) {
|
if (ret == 0 && (*src)->checksum_index > 0 &&
|
||||||
|
!img->opts->will_cancel) {
|
||||||
/* Duplicate file source was mapped to previously registered source
|
/* Duplicate file source was mapped to previously registered source
|
||||||
*/
|
*/
|
||||||
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
||||||
@ -140,8 +141,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
}
|
}
|
||||||
iso_stream_ref(fsrc->stream);
|
iso_stream_ref(fsrc->stream);
|
||||||
|
|
||||||
if ((img->md5_file_checksums & 1) &&
|
if ((img->opts->md5_file_checksums & 1) &&
|
||||||
file->from_old_session && img->appendable) {
|
file->from_old_session && img->opts->appendable) {
|
||||||
ret = iso_node_get_xinfo((IsoNode *) file, checksum_md5_xinfo_func,
|
ret = iso_node_get_xinfo((IsoNode *) file, checksum_md5_xinfo_func,
|
||||||
&xipt);
|
&xipt);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
@ -152,13 +153,14 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
no_md5 = 1;
|
no_md5 = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((img->md5_file_checksums & 1) && !no_md5) {
|
if ((img->opts->md5_file_checksums & 1) &&
|
||||||
|
!(no_md5 || img->opts->will_cancel)) {
|
||||||
img->checksum_idx_counter++;
|
img->checksum_idx_counter++;
|
||||||
if (img->checksum_idx_counter < 0x7fffffff) {
|
if (img->checksum_idx_counter < 0x7fffffff) {
|
||||||
fsrc->checksum_index = img->checksum_idx_counter;
|
fsrc->checksum_index = img->checksum_idx_counter;
|
||||||
} else {
|
} else {
|
||||||
fsrc->checksum_index= 0;
|
fsrc->checksum_index= 0;
|
||||||
img->checksum_idx_counter= 0x7fffffff; /* keep from rolling over */
|
img->checksum_idx_counter= 0x7ffffffe; /* keep from rolling over */
|
||||||
}
|
}
|
||||||
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
|
||||||
if (cret < 0)
|
if (cret < 0)
|
||||||
@ -244,11 +246,11 @@ int filesrc_writer_pre_compute(IsoImageWriter *writer)
|
|||||||
/* Normally reserve a single zeroed block for all files which have
|
/* Normally reserve a single zeroed block for all files which have
|
||||||
no block address: symbolic links, device files, empty data files.
|
no block address: symbolic links, device files, empty data files.
|
||||||
*/
|
*/
|
||||||
if (! t->old_empty)
|
if (! t->opts->old_empty)
|
||||||
t->filesrc_blocks++;
|
t->filesrc_blocks++;
|
||||||
|
|
||||||
/* on appendable images, ms files shouldn't be included */
|
/* on appendable images, ms files shouldn't be included */
|
||||||
if (t->appendable) {
|
if (t->opts->appendable) {
|
||||||
inc_item = shall_be_written;
|
inc_item = shall_be_written;
|
||||||
} else {
|
} else {
|
||||||
inc_item = NULL;
|
inc_item = NULL;
|
||||||
@ -261,7 +263,7 @@ int filesrc_writer_pre_compute(IsoImageWriter *writer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* sort files by weight, if needed */
|
/* sort files by weight, if needed */
|
||||||
if (t->sort_files) {
|
if (t->opts->sort_files) {
|
||||||
qsort(filelist, size, sizeof(void*), cmp_by_weight);
|
qsort(filelist, size, sizeof(void*), cmp_by_weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,6 +337,9 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t = writer->target;
|
t = writer->target;
|
||||||
filelist = (IsoFileSrc **) writer->data;
|
filelist = (IsoFileSrc **) writer->data;
|
||||||
|
|
||||||
|
/* >>> HFS: need to align to allocation block size */;
|
||||||
|
/* >>> HFS: ??? how to handle multi-extent files ? */;
|
||||||
|
|
||||||
t->filesrc_start = t->curblock;
|
t->filesrc_start = t->curblock;
|
||||||
|
|
||||||
/* Give all extent addresses their final absolute value */
|
/* Give all extent addresses their final absolute value */
|
||||||
@ -433,7 +438,7 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
|
|||||||
file_size = iso_file_src_get_size(file);
|
file_size = iso_file_src_get_size(file);
|
||||||
nblocks = DIV_UP(file_size, BLOCK_SIZE);
|
nblocks = DIV_UP(file_size, BLOCK_SIZE);
|
||||||
pre_md5_valid = 0;
|
pre_md5_valid = 0;
|
||||||
if (file->checksum_index > 0 && (t->md5_file_checksums & 2)) {
|
if (file->checksum_index > 0 && (t->opts->md5_file_checksums & 2)) {
|
||||||
/* Obtain an MD5 of content by a first read pass */
|
/* Obtain an MD5 of content by a first read pass */
|
||||||
pre_md5_valid = filesrc_make_md5(t, file, pre_md5, 0);
|
pre_md5_valid = filesrc_make_md5(t, file, pre_md5, 0);
|
||||||
}
|
}
|
||||||
@ -488,12 +493,14 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* >>> HFS: need to align to allocation block size */;
|
||||||
|
|
||||||
#ifdef Libisofs_with_libjtE
|
#ifdef Libisofs_with_libjtE
|
||||||
if (t->libjte_handle != NULL) {
|
if (t->opts->libjte_handle != NULL) {
|
||||||
res = libjte_begin_data_file(t->libjte_handle, name,
|
res = libjte_begin_data_file(t->opts->libjte_handle, name,
|
||||||
BLOCK_SIZE, file_size);
|
BLOCK_SIZE, file_size);
|
||||||
if (res <= 0) {
|
if (res <= 0) {
|
||||||
res = iso_libjte_forward_msgs(t->libjte_handle, t->image->id,
|
res = iso_libjte_forward_msgs(t->opts->libjte_handle, t->image->id,
|
||||||
ISO_LIBJTE_FILE_FAILED, 0);
|
ISO_LIBJTE_FILE_FAILED, 0);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
filesrc_close(file);
|
filesrc_close(file);
|
||||||
@ -588,7 +595,7 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
|
|||||||
res = iso_md5_end(&ctx, md5);
|
res = iso_md5_end(&ctx, md5);
|
||||||
if (res <= 0)
|
if (res <= 0)
|
||||||
file->checksum_index = 0;
|
file->checksum_index = 0;
|
||||||
if ((t->md5_file_checksums & 2) && pre_md5_valid > 0 &&
|
if ((t->opts->md5_file_checksums & 2) && pre_md5_valid > 0 &&
|
||||||
!was_error) {
|
!was_error) {
|
||||||
if (! iso_md5_match(md5, pre_md5)) {
|
if (! iso_md5_match(md5, pre_md5)) {
|
||||||
/* Issue MISHAP event */
|
/* Issue MISHAP event */
|
||||||
@ -614,8 +621,8 @@ ex:;
|
|||||||
|
|
||||||
#ifdef Libisofs_with_libjtE
|
#ifdef Libisofs_with_libjtE
|
||||||
if (jte_begun) {
|
if (jte_begun) {
|
||||||
res = libjte_end_data_file(t->libjte_handle);
|
res = libjte_end_data_file(t->opts->libjte_handle);
|
||||||
iso_libjte_forward_msgs(t->libjte_handle, t->image->id,
|
iso_libjte_forward_msgs(t->opts->libjte_handle, t->image->id,
|
||||||
ISO_LIBJTE_END_FAILED, 0);
|
ISO_LIBJTE_END_FAILED, 0);
|
||||||
if (res <= 0 && ret >= 0)
|
if (res <= 0 && ret >= 0)
|
||||||
ret = ISO_LIBJTE_FILE_FAILED;
|
ret = ISO_LIBJTE_FILE_FAILED;
|
||||||
@ -653,7 +660,7 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
|||||||
files which have no block address:
|
files which have no block address:
|
||||||
symbolic links, device files, empty data files.
|
symbolic links, device files, empty data files.
|
||||||
*/
|
*/
|
||||||
if (! t->old_empty) {
|
if (! t->opts->old_empty) {
|
||||||
ret = iso_write(t, buffer, BLOCK_SIZE);
|
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2011 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -35,6 +35,22 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* Enable this and write the correct absolute path into the include statement
|
||||||
|
below in order to test the pending contribution to syslinux:
|
||||||
|
http://www.syslinux.org/archives/2013-March/019755.html
|
||||||
|
|
||||||
|
# def ine Libisofs_syslinux_tesT 1
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifdef Libisofs_syslinux_tesT
|
||||||
|
#define Isolinux_rockridge_in_libisofS 1
|
||||||
|
#include "/reiser/syslinux/core/fs/iso9660/susp_rr.c"
|
||||||
|
/*
|
||||||
|
# inc lude "/home/thomas/projekte/cdrskin_dir/libisoburn-develop/test/susp_rr.c"
|
||||||
|
*/
|
||||||
|
#endif /* Libisofs_syslinux_tesT */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options for image reading.
|
* Options for image reading.
|
||||||
* There are four kind of options:
|
* There are four kind of options:
|
||||||
@ -241,6 +257,10 @@ typedef struct
|
|||||||
char *copyright_file_id;
|
char *copyright_file_id;
|
||||||
char *abstract_file_id;
|
char *abstract_file_id;
|
||||||
char *biblio_file_id;
|
char *biblio_file_id;
|
||||||
|
char *creation_time;
|
||||||
|
char *modification_time;
|
||||||
|
char *expiration_time;
|
||||||
|
char *effective_time;
|
||||||
|
|
||||||
/* extension information */
|
/* extension information */
|
||||||
|
|
||||||
@ -310,6 +330,32 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
int px_ino_status;
|
int px_ino_status;
|
||||||
|
|
||||||
|
/* Which Rock Ridge error messages already have occured
|
||||||
|
bit0= Invalid PX entry
|
||||||
|
bit1= Invalid TF entry
|
||||||
|
bit2= New NM entry found without previous CONTINUE flag
|
||||||
|
bit3= Invalid NM entry
|
||||||
|
bit4= New SL entry found without previous CONTINUE flag
|
||||||
|
bit5= Invalid SL entry
|
||||||
|
bit6= Invalid SL entry, no child location
|
||||||
|
bit7= Invalid PN entry
|
||||||
|
bit8= Sparse files not supported
|
||||||
|
bit9= SP entry found in a directory entry other than '.' entry of root
|
||||||
|
bit10= ER entry found in a directory entry other than '.' entry of root
|
||||||
|
bit11= Invalid AA entry
|
||||||
|
bit12= Invalid AL entry
|
||||||
|
bit13= Invalid ZF entry
|
||||||
|
bit14= Rock Ridge PX entry is not present or invalid
|
||||||
|
bit15= Incomplete NM
|
||||||
|
bit16= Incomplete SL
|
||||||
|
bit17= Charset conversion error
|
||||||
|
bit18= Link without destination
|
||||||
|
*/
|
||||||
|
int rr_err_reported;
|
||||||
|
int rr_err_repeated;
|
||||||
|
|
||||||
|
size_t joliet_ucs2_failures;
|
||||||
|
|
||||||
} _ImageFsData;
|
} _ImageFsData;
|
||||||
|
|
||||||
typedef struct image_fs_data ImageFileSourceData;
|
typedef struct image_fs_data ImageFileSourceData;
|
||||||
@ -430,6 +476,8 @@ int ifs_lstat(IsoFileSource *src, struct stat *info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
data = src->data;
|
data = src->data;
|
||||||
|
if (data == NULL)
|
||||||
|
return ISO_NULL_POINTER;
|
||||||
*info = data->info;
|
*info = data->info;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1189,33 +1237,107 @@ int iso_ifs_source_get_zf(IsoFileSource *src, int *header_size_div4,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
int make_hopefully_unique_name(_ImageFsData *fsdata,
|
||||||
|
char *str, size_t len, char **name)
|
||||||
|
{
|
||||||
|
int ret, name_len, i;
|
||||||
|
char c, *smashed = NULL, md5[16];
|
||||||
|
void *md5_context = NULL;
|
||||||
|
|
||||||
|
/* Shorten so that 32 characters of MD5 fit.
|
||||||
|
If shorter than 8, pad up to 8 by '_'.
|
||||||
|
Smash characters to [0-9A-Za-z_.].
|
||||||
|
Append MD5 of original str as hex digits.
|
||||||
|
*/
|
||||||
|
name_len = len > 223 ? 223 : len;
|
||||||
|
LIBISO_ALLOC_MEM(smashed, char, (name_len >= 8 ? name_len : 8) + 32 + 1);
|
||||||
|
memcpy(smashed, str, name_len);
|
||||||
|
for (; name_len < 8; name_len++)
|
||||||
|
smashed[name_len] = '_';
|
||||||
|
smashed[name_len] = 0;
|
||||||
|
for (i = 0; i < name_len; i++) {
|
||||||
|
c = smashed[i];
|
||||||
|
if (c == '.' || (c >= '0' && c <= '9') ||
|
||||||
|
c == '_' || (c >= 'a' && c <= 'z'))
|
||||||
|
continue;
|
||||||
|
smashed[i] = '_';
|
||||||
|
}
|
||||||
|
ret = iso_md5_start(&md5_context);
|
||||||
|
if (ret != 1)
|
||||||
|
goto ex;
|
||||||
|
ret = iso_md5_compute(md5_context, str, len);
|
||||||
|
if (ret != 1)
|
||||||
|
goto ex;
|
||||||
|
ret = iso_md5_end(&md5_context, md5);
|
||||||
|
if (ret != 1)
|
||||||
|
goto ex;
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
sprintf(smashed + i * 2 + name_len, "%2.2x",
|
||||||
|
((unsigned char *) md5)[i]);
|
||||||
|
name_len += 32;
|
||||||
|
smashed[name_len] = 0;
|
||||||
|
*name = smashed; smashed = NULL;
|
||||||
|
|
||||||
|
ret = ISO_SUCCESS;
|
||||||
|
ex:
|
||||||
|
LIBISO_FREE_MEM(smashed);
|
||||||
|
if (md5_context != NULL)
|
||||||
|
iso_md5_end(&md5_context, md5);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a file name from a directory record, doing the needed charset
|
* Read a file name from a directory record, doing the needed charset
|
||||||
* conversion
|
* conversion
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
char *get_name(_ImageFsData *fsdata, const char *str, size_t len)
|
char *get_name(_ImageFsData *fsdata, char *str, size_t len)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char *name = NULL;
|
char *name = NULL, *from_ucs = NULL;
|
||||||
|
|
||||||
if (strcmp(fsdata->local_charset, fsdata->input_charset)) {
|
if (strcmp(fsdata->local_charset, fsdata->input_charset)) {
|
||||||
/* charset conversion needed */
|
/* charset conversion needed */
|
||||||
ret = strnconv(str, fsdata->input_charset, fsdata->local_charset, len,
|
ret = strnconv(str, fsdata->input_charset, fsdata->local_charset, len,
|
||||||
&name);
|
&name);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
|
if (fsdata->iso_root_block == fsdata->svd_root_block) {
|
||||||
|
/* Reading from Joliet : Check whether UTF-16 was needed */
|
||||||
|
ret = strnconv(str, "UCS-2BE", fsdata->local_charset,
|
||||||
|
len, &from_ucs);
|
||||||
|
if (ret == 1)
|
||||||
|
ret = (strcmp(name, from_ucs) == 0);
|
||||||
|
if (ret != 1) {
|
||||||
|
fsdata->joliet_ucs2_failures++;
|
||||||
|
if (fsdata->joliet_ucs2_failures <=
|
||||||
|
ISO_JOLIET_UCS2_WARN_MAX)
|
||||||
|
iso_msg_submit(-1, ISO_NAME_NOT_UCS2, 0,
|
||||||
|
"Joliet filename valid only with character set UTF-16 : \"%s\"",
|
||||||
|
name);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (from_ucs != NULL)
|
||||||
|
free(from_ucs);
|
||||||
|
}
|
||||||
return name;
|
return name;
|
||||||
} else {
|
} else {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET, ret,
|
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET, ret,
|
||||||
"Charset conversion error. Cannot convert from %s to %s",
|
"Cannot convert from charset %s to %s",
|
||||||
fsdata->input_charset, fsdata->local_charset);
|
fsdata->input_charset, fsdata->local_charset);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return NULL; /* aborted */
|
return NULL; /* aborted */
|
||||||
}
|
}
|
||||||
/* fallback */
|
/* fallback */
|
||||||
|
ret = make_hopefully_unique_name(fsdata, str, len, &name);
|
||||||
|
if (ret == ISO_SUCCESS)
|
||||||
|
return name;
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we reach here when the charset conversion is not needed or has failed */
|
/* we reach here when the charset conversion is not needed */
|
||||||
|
|
||||||
name = malloc(len + 1);
|
name = malloc(len + 1);
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
@ -1227,6 +1349,30 @@ char *get_name(_ImageFsData *fsdata, const char *str, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
int iso_rr_msg_submit(_ImageFsData *fsdata, int rr_err_bit,
|
||||||
|
int errcode, int causedby, const char *msg)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((fsdata->rr_err_reported & (1 << rr_err_bit)) &&
|
||||||
|
(fsdata->rr_err_repeated & (1 << rr_err_bit))) {
|
||||||
|
if (iso_msg_is_abort(errcode))
|
||||||
|
return ISO_CANCELED;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (fsdata->rr_err_reported & (1 << rr_err_bit)) {
|
||||||
|
ret = iso_msg_submit(fsdata->msgid, errcode, causedby,
|
||||||
|
"MORE THAN ONCE : %s", msg);
|
||||||
|
fsdata->rr_err_repeated |= (1 << rr_err_bit);
|
||||||
|
} else {
|
||||||
|
ret = iso_msg_submit(fsdata->msgid, errcode, causedby, "%s", msg);
|
||||||
|
fsdata->rr_err_reported |= (1 << rr_err_bit);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param src
|
* @param src
|
||||||
@ -1417,8 +1563,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = read_rr_PX(sue, &atts);
|
ret = read_rr_PX(sue, &atts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 0, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid PX entry");
|
"Invalid PX entry");
|
||||||
fsdata->px_ino_status |= 8;
|
fsdata->px_ino_status |= 8;
|
||||||
} if (ret == 2) {
|
} if (ret == 2) {
|
||||||
if (fsdata->inode_counter < atts.st_ino)
|
if (fsdata->inode_counter < atts.st_ino)
|
||||||
@ -1433,13 +1579,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = read_rr_TF(sue, &atts);
|
ret = read_rr_TF(sue, &atts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 1, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid TF entry");
|
"Invalid TF entry");
|
||||||
}
|
}
|
||||||
} else if (SUSP_SIG(sue, 'N', 'M')) {
|
} else if (SUSP_SIG(sue, 'N', 'M')) {
|
||||||
if (name != NULL && namecont == 0) {
|
if (name != NULL && namecont == 0) {
|
||||||
/* ups, RR standard violation */
|
/* ups, RR standard violation */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, 0,
|
ret = iso_rr_msg_submit(fsdata, 2, ISO_WRONG_RR_WARN, 0,
|
||||||
"New NM entry found without previous"
|
"New NM entry found without previous"
|
||||||
"CONTINUE flag. Ignored");
|
"CONTINUE flag. Ignored");
|
||||||
continue;
|
continue;
|
||||||
@ -1447,13 +1593,52 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = read_rr_NM(sue, &name, &namecont);
|
ret = read_rr_NM(sue, &name, &namecont);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 3, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid NM entry");
|
"Invalid NM entry");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Libisofs_syslinux_tesT
|
||||||
|
|
||||||
|
if (name != NULL && !namecont) {
|
||||||
|
struct device syslinux_dev;
|
||||||
|
struct iso_sb_info syslinux_sbi;
|
||||||
|
struct fs_info syslinux_fsi;
|
||||||
|
char *syslinux_name = NULL;
|
||||||
|
int syslinux_name_len;
|
||||||
|
|
||||||
|
syslinux_dev.src = fsdata->src;
|
||||||
|
memset(&(syslinux_sbi.root), 0, 256);
|
||||||
|
syslinux_sbi.do_rr = 1;
|
||||||
|
syslinux_sbi.susp_skip = 0;
|
||||||
|
syslinux_fsi.fs_dev = &syslinux_dev;
|
||||||
|
syslinux_fsi.fs_info = &syslinux_sbi;
|
||||||
|
ret = susp_rr_get_nm(&syslinux_fsi, (char *) record,
|
||||||
|
&syslinux_name, &syslinux_name_len);
|
||||||
|
if (ret == 1) {
|
||||||
|
if (name == NULL || syslinux_name == NULL)
|
||||||
|
fprintf(stderr, "################ Hoppla. NULL\n");
|
||||||
|
else if(strcmp(syslinux_name, name) != 0)
|
||||||
|
fprintf(stderr,
|
||||||
|
"################ libisofs '%s' != '%s' susp_rr_get_nm()\n",
|
||||||
|
name, syslinux_name);
|
||||||
|
} else if (ret == 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"################ '%s' not found by susp_rr_get_nm()\n", name);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "################ 'susp_rr_get_nm() returned error\n");
|
||||||
|
}
|
||||||
|
if (syslinux_name != NULL)
|
||||||
|
free(syslinux_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Libisofs_syslinux_tesT */
|
||||||
|
|
||||||
|
|
||||||
} else if (SUSP_SIG(sue, 'S', 'L')) {
|
} else if (SUSP_SIG(sue, 'S', 'L')) {
|
||||||
if (linkdest != NULL && linkdestcont == 0) {
|
if (linkdest != NULL && linkdestcont == 0) {
|
||||||
/* ups, RR standard violation */
|
/* ups, RR standard violation */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, 0,
|
ret = iso_rr_msg_submit(fsdata, 4, ISO_WRONG_RR_WARN, 0,
|
||||||
"New SL entry found without previous"
|
"New SL entry found without previous"
|
||||||
"CONTINUE flag. Ignored");
|
"CONTINUE flag. Ignored");
|
||||||
continue;
|
continue;
|
||||||
@ -1461,8 +1646,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = read_rr_SL(sue, &linkdest, &linkdestcont);
|
ret = read_rr_SL(sue, &linkdest, &linkdestcont);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 5, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid SL entry");
|
"Invalid SL entry");
|
||||||
}
|
}
|
||||||
} else if (SUSP_SIG(sue, 'R', 'E')) {
|
} else if (SUSP_SIG(sue, 'R', 'E')) {
|
||||||
/*
|
/*
|
||||||
@ -1482,7 +1667,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
*/
|
*/
|
||||||
relocated_dir = iso_read_bb(sue->data.CL.child_loc, 4, NULL);
|
relocated_dir = iso_read_bb(sue->data.CL.child_loc, 4, NULL);
|
||||||
if (relocated_dir == 0) {
|
if (relocated_dir == 0) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 6, ISO_WRONG_RR, 0,
|
||||||
"Invalid SL entry, no child location");
|
"Invalid SL entry, no child location");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1490,12 +1675,12 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = read_rr_PN(sue, &atts);
|
ret = read_rr_PN(sue, &atts);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 7, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid PN entry");
|
"Invalid PN entry");
|
||||||
}
|
}
|
||||||
} else if (SUSP_SIG(sue, 'S', 'F')) {
|
} else if (SUSP_SIG(sue, 'S', 'F')) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_UNSUPPORTED_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 8, ISO_UNSUPPORTED_RR, 0,
|
||||||
"Sparse files not supported.");
|
"Sparse files not supported.");
|
||||||
break;
|
break;
|
||||||
} else if (SUSP_SIG(sue, 'R', 'R')) {
|
} else if (SUSP_SIG(sue, 'R', 'R')) {
|
||||||
/* This was an optional flag byte in RRIP 1.09 which told the
|
/* This was an optional flag byte in RRIP 1.09 which told the
|
||||||
@ -1510,7 +1695,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
*/
|
*/
|
||||||
if (!(flag & 1)) {
|
if (!(flag & 1)) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 9, ISO_WRONG_RR, 0,
|
||||||
"SP entry found in a directory entry other "
|
"SP entry found in a directory entry other "
|
||||||
"than '.' entry of root node");
|
"than '.' entry of root node");
|
||||||
}
|
}
|
||||||
@ -1522,7 +1707,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
*/
|
*/
|
||||||
if (!(flag & 1)) {
|
if (!(flag & 1)) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 10, ISO_WRONG_RR, 0,
|
||||||
"ER entry found in a directory entry other "
|
"ER entry found in a directory entry other "
|
||||||
"than '.' entry of root node");
|
"than '.' entry of root node");
|
||||||
}
|
}
|
||||||
@ -1537,8 +1722,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
&prev_field, &aa_done, 0);
|
&prev_field, &aa_done, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 11, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid AA entry");
|
"Invalid AA entry");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1548,8 +1733,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
&prev_field, &aa_done, 0);
|
&prev_field, &aa_done, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 12, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid AL entry");
|
"Invalid AL entry");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1561,7 +1746,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
&zisofs_bsl2, &zisofs_usize, 0);
|
&zisofs_bsl2, &zisofs_usize, 0);
|
||||||
if (ret < 0 || zisofs_alg[0] != 'p' || zisofs_alg[1] != 'z') {
|
if (ret < 0 || zisofs_alg[0] != 'p' || zisofs_alg[1] != 'z') {
|
||||||
/* notify and continue */
|
/* notify and continue */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
ret = iso_rr_msg_submit(fsdata, 13, ISO_WRONG_RR_WARN, ret,
|
||||||
"Invalid ZF entry");
|
"Invalid ZF entry");
|
||||||
zisofs_hs4 = 0;
|
zisofs_hs4 = 0;
|
||||||
continue;
|
continue;
|
||||||
@ -1587,17 +1772,17 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
/* error was already submitted above */
|
/* error was already submitted above */
|
||||||
iso_msg_debug(fsdata->msgid, "Error parsing RR entries");
|
iso_msg_debug(fsdata->msgid, "Error parsing RR entries");
|
||||||
} else if (!relocated_dir && atts.st_mode == (mode_t) 0 ) {
|
} else if (!relocated_dir && atts.st_mode == (mode_t) 0 ) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0, "Mandatory "
|
ret = iso_rr_msg_submit(fsdata, 14, ISO_WRONG_RR, 0, "Mandatory "
|
||||||
"Rock Ridge PX entry is not present or it "
|
"Rock Ridge PX entry is not present or it "
|
||||||
"contains invalid values.");
|
"contains invalid values.");
|
||||||
} else {
|
} else {
|
||||||
/* ensure both name and link dest are finished */
|
/* ensure both name and link dest are finished */
|
||||||
if (namecont != 0) {
|
if (namecont != 0) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 15, ISO_WRONG_RR, 0,
|
||||||
"Incomplete RR name, last NM entry continues");
|
"Incomplete Rock Ridge name, last NM entry continues");
|
||||||
}
|
}
|
||||||
if (linkdestcont != 0) {
|
if (linkdestcont != 0) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 16, ISO_WRONG_RR, 0,
|
||||||
"Incomplete link destination, last SL entry continues");
|
"Incomplete link destination, last SL entry continues");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1611,6 +1796,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = iso_aa_lookup_attr(aa_string, "isofs.cs",
|
ret = iso_aa_lookup_attr(aa_string, "isofs.cs",
|
||||||
&cs_value_length, &cs_value, 0);
|
&cs_value_length, &cs_value, 0);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
|
LIBISO_FREE_MEM(msg);
|
||||||
LIBISO_ALLOC_MEM(msg, char, 160);
|
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||||
if (fsdata->auto_input_charset & 1) {
|
if (fsdata->auto_input_charset & 1) {
|
||||||
if (fsdata->input_charset != NULL)
|
if (fsdata->input_charset != NULL)
|
||||||
@ -1638,10 +1824,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
&newname);
|
&newname);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* its just a hint message */
|
/* its just a hint message */
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET,
|
LIBISO_FREE_MEM(msg);
|
||||||
ret, "Charset conversion error. Cannot "
|
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||||
"convert from %s to %s",
|
sprintf(msg,
|
||||||
|
"Cannot convert from charset %.40s to %.40s",
|
||||||
fsdata->input_charset, fsdata->local_charset);
|
fsdata->input_charset, fsdata->local_charset);
|
||||||
|
ret = iso_rr_msg_submit(fsdata, 17, ISO_FILENAME_WRONG_CHARSET,
|
||||||
|
ret, msg);
|
||||||
free(newname);
|
free(newname);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(name);
|
free(name);
|
||||||
@ -1660,10 +1849,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
ret = strconv(linkdest, fsdata->input_charset,
|
ret = strconv(linkdest, fsdata->input_charset,
|
||||||
fsdata->local_charset, &newlinkdest);
|
fsdata->local_charset, &newlinkdest);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET,
|
LIBISO_FREE_MEM(msg);
|
||||||
ret, "Charset conversion error. Cannot "
|
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||||
"convert from %s to %s",
|
sprintf(msg,
|
||||||
|
"Charset conversion error. Cannot convert from %.40s to %.40s",
|
||||||
fsdata->input_charset, fsdata->local_charset);
|
fsdata->input_charset, fsdata->local_charset);
|
||||||
|
ret = iso_rr_msg_submit(fsdata, 17, ISO_FILENAME_WRONG_CHARSET,
|
||||||
|
ret, msg);
|
||||||
free(newlinkdest);
|
free(newlinkdest);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(name);
|
free(name);
|
||||||
@ -1786,8 +1978,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
|||||||
|
|
||||||
/* TODO #00014 : more sanity checks to ensure dir record info is valid */
|
/* TODO #00014 : more sanity checks to ensure dir record info is valid */
|
||||||
if (S_ISLNK(atts.st_mode) && (linkdest == NULL)) {
|
if (S_ISLNK(atts.st_mode) && (linkdest == NULL)) {
|
||||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
ret = iso_rr_msg_submit(fsdata, 18, ISO_WRONG_RR, 0,
|
||||||
"Link without destination.");
|
"Link without destination.");
|
||||||
free(name);
|
free(name);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
@ -2087,6 +2279,10 @@ void ifs_fs_free(IsoFilesystem *fs)
|
|||||||
free(data->copyright_file_id);
|
free(data->copyright_file_id);
|
||||||
free(data->abstract_file_id);
|
free(data->abstract_file_id);
|
||||||
free(data->biblio_file_id);
|
free(data->biblio_file_id);
|
||||||
|
free(data->creation_time);
|
||||||
|
free(data->modification_time);
|
||||||
|
free(data->expiration_time);
|
||||||
|
free(data->effective_time);
|
||||||
free(data->input_charset);
|
free(data->input_charset);
|
||||||
free(data->local_charset);
|
free(data->local_charset);
|
||||||
|
|
||||||
@ -2121,6 +2317,27 @@ int read_root_susp_entries(_ImageFsData *data, uint32_t block)
|
|||||||
/* record will be the "." directory entry for the root record */
|
/* record will be the "." directory entry for the root record */
|
||||||
record = (struct ecma119_dir_record *)buffer;
|
record = (struct ecma119_dir_record *)buffer;
|
||||||
|
|
||||||
|
#ifdef Libisofs_syslinux_tesT
|
||||||
|
|
||||||
|
{
|
||||||
|
struct device syslinux_dev;
|
||||||
|
struct iso_sb_info syslinux_sbi;
|
||||||
|
struct fs_info syslinux_fsi;
|
||||||
|
|
||||||
|
syslinux_dev.src = data->src;
|
||||||
|
memcpy(&(syslinux_sbi.root), (char *) record, 256);
|
||||||
|
syslinux_sbi.do_rr = 1;
|
||||||
|
syslinux_sbi.susp_skip = 0;
|
||||||
|
syslinux_fsi.fs_dev = &syslinux_dev;
|
||||||
|
syslinux_fsi.fs_info = &syslinux_sbi;
|
||||||
|
|
||||||
|
ret = susp_rr_check_signatures(&syslinux_fsi, 1);
|
||||||
|
fprintf(stderr, "--------- susp_rr_check_signatures == %d , syslinux_sbi.do_rr == %d\n", ret, syslinux_sbi.do_rr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* Libisofs_syslinux_tesT */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO #00015 : take care of CD-ROM XA discs when reading SP entry
|
* TODO #00015 : take care of CD-ROM XA discs when reading SP entry
|
||||||
* SUSP specification claims that for CD-ROM XA the SP entry
|
* SUSP specification claims that for CD-ROM XA the SP entry
|
||||||
@ -2315,7 +2532,15 @@ int read_pvm(_ImageFsData *data, uint32_t block)
|
|||||||
data->copyright_file_id[0] = 0;
|
data->copyright_file_id[0] = 0;
|
||||||
data->abstract_file_id[0] = 0;
|
data->abstract_file_id[0] = 0;
|
||||||
data->biblio_file_id[0] = 0;
|
data->biblio_file_id[0] = 0;
|
||||||
}
|
}
|
||||||
|
data->creation_time =
|
||||||
|
iso_util_strcopy_untail((char*) pvm->vol_creation_time, 17);
|
||||||
|
data->modification_time =
|
||||||
|
iso_util_strcopy_untail((char*) pvm->vol_modification_time, 17);
|
||||||
|
data->expiration_time =
|
||||||
|
iso_util_strcopy_untail((char*) pvm->vol_expiration_time, 17);
|
||||||
|
data->effective_time =
|
||||||
|
iso_util_strcopy_untail((char*) pvm->vol_effective_time, 17);
|
||||||
|
|
||||||
data->nblocks = iso_read_bb(pvm->vol_space_size, 4, NULL);
|
data->nblocks = iso_read_bb(pvm->vol_space_size, 4, NULL);
|
||||||
|
|
||||||
@ -2605,6 +2830,9 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
|||||||
data->bootblocks[i] = 0;
|
data->bootblocks[i] = 0;
|
||||||
data->inode_counter = 0;
|
data->inode_counter = 0;
|
||||||
data->px_ino_status = 0;
|
data->px_ino_status = 0;
|
||||||
|
data->rr_err_reported = 0;
|
||||||
|
data->rr_err_repeated = 0;
|
||||||
|
data->joliet_ucs2_failures = 0;
|
||||||
|
|
||||||
|
|
||||||
data->local_charset = strdup(iso_get_local_charset(0));
|
data->local_charset = strdup(iso_get_local_charset(0));
|
||||||
@ -2755,7 +2983,10 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
|||||||
if (!opts->nojoliet && opts->preferjoliet && data->joliet) {
|
if (!opts->nojoliet && opts->preferjoliet && data->joliet) {
|
||||||
/* if user prefers joliet, that is used */
|
/* if user prefers joliet, that is used */
|
||||||
iso_msg_debug(data->msgid, "Reading Joliet extensions.");
|
iso_msg_debug(data->msgid, "Reading Joliet extensions.");
|
||||||
data->input_charset = strdup("UCS-2BE");
|
/* Although Joliet prescribes UCS-2BE, interpret names by its
|
||||||
|
superset UTF-16BE in order to avoid conversion failures.
|
||||||
|
*/
|
||||||
|
data->input_charset = strdup("UTF-16BE");
|
||||||
data->rr = RR_EXT_NO;
|
data->rr = RR_EXT_NO;
|
||||||
data->iso_root_block = data->svd_root_block;
|
data->iso_root_block = data->svd_root_block;
|
||||||
} else {
|
} else {
|
||||||
@ -2768,7 +2999,7 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
|||||||
if (!opts->nojoliet && data->joliet) {
|
if (!opts->nojoliet && data->joliet) {
|
||||||
/* joliet will be used */
|
/* joliet will be used */
|
||||||
iso_msg_debug(data->msgid, "Reading Joliet extensions.");
|
iso_msg_debug(data->msgid, "Reading Joliet extensions.");
|
||||||
data->input_charset = strdup("UCS-2BE");
|
data->input_charset = strdup("UTF-16BE");
|
||||||
data->iso_root_block = data->svd_root_block;
|
data->iso_root_block = data->svd_root_block;
|
||||||
} else if (!opts->noiso1999 && data->iso1999) {
|
} else if (!opts->noiso1999 && data->iso1999) {
|
||||||
/* we will read ISO 9660:1999 */
|
/* we will read ISO 9660:1999 */
|
||||||
@ -2851,13 +3082,14 @@ int src_aa_to_node(IsoFileSource *src, IsoNode *node, int flag)
|
|||||||
|
|
||||||
static
|
static
|
||||||
int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||||
IsoFileSource *src, IsoNode **node)
|
IsoFileSource *src, char *in_name,
|
||||||
|
IsoNode **node)
|
||||||
{
|
{
|
||||||
int ret, idx, to_copy;
|
int ret, idx, to_copy;
|
||||||
struct stat info;
|
struct stat info;
|
||||||
IsoNode *new;
|
IsoNode *new = NULL;
|
||||||
IsoBoot *bootcat;
|
IsoBoot *bootcat;
|
||||||
char *name;
|
char *name = NULL;
|
||||||
char *dest = NULL;
|
char *dest = NULL;
|
||||||
ImageFileSourceData *data;
|
ImageFileSourceData *data;
|
||||||
_ImageFsData *fsdata;
|
_ImageFsData *fsdata;
|
||||||
@ -2877,7 +3109,14 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
data = (ImageFileSourceData*)src->data;
|
data = (ImageFileSourceData*)src->data;
|
||||||
fsdata = data->fs->data;
|
fsdata = data->fs->data;
|
||||||
|
|
||||||
name = iso_file_source_get_name(src);
|
if (in_name == NULL) {
|
||||||
|
name = iso_file_source_get_name(src);
|
||||||
|
} else {
|
||||||
|
name = strdup(in_name);
|
||||||
|
if (name == NULL) {
|
||||||
|
ret = ISO_OUT_OF_MEM; goto ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* get info about source */
|
/* get info about source */
|
||||||
ret = iso_file_source_lstat(src, &info);
|
ret = iso_file_source_lstat(src, &info);
|
||||||
@ -2885,7 +3124,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
new = NULL;
|
|
||||||
switch (info.st_mode & S_IFMT) {
|
switch (info.st_mode & S_IFMT) {
|
||||||
case S_IFREG:
|
case S_IFREG:
|
||||||
{
|
{
|
||||||
@ -2899,9 +3137,8 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
"More than one catalog node has been found. "
|
"More than one catalog node has been found. "
|
||||||
"We can continue, but that could lead to "
|
"We can continue, but that could lead to "
|
||||||
"problems");
|
"problems");
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
|
||||||
iso_node_unref((IsoNode*)image->bootcat->node);
|
iso_node_unref((IsoNode*)image->bootcat->node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2909,9 +3146,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
* a regular file */
|
* a regular file */
|
||||||
new = calloc(1, sizeof(IsoBoot));
|
new = calloc(1, sizeof(IsoBoot));
|
||||||
if (new == NULL) {
|
if (new == NULL) {
|
||||||
ret = ISO_OUT_OF_MEM;
|
ret = ISO_OUT_OF_MEM; goto ex;
|
||||||
free(name);
|
|
||||||
goto ex;
|
|
||||||
}
|
}
|
||||||
bootcat = (IsoBoot *) new;
|
bootcat = (IsoBoot *) new;
|
||||||
bootcat->lba = data->sections[0].block;
|
bootcat->lba = data->sections[0].block;
|
||||||
@ -2922,10 +3157,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
if (bootcat->size > 0) {
|
if (bootcat->size > 0) {
|
||||||
bootcat->content = calloc(1, bootcat->size);
|
bootcat->content = calloc(1, bootcat->size);
|
||||||
if (bootcat->content == NULL) {
|
if (bootcat->content == NULL) {
|
||||||
ret = ISO_OUT_OF_MEM;
|
ret = ISO_OUT_OF_MEM; goto ex;
|
||||||
free(name);
|
|
||||||
free(new);
|
|
||||||
goto ex;
|
|
||||||
}
|
}
|
||||||
to_copy = bootcat->size;
|
to_copy = bootcat->size;
|
||||||
if (bootcat->size > fsdata->catsize)
|
if (bootcat->size > fsdata->catsize)
|
||||||
@ -2942,16 +3174,14 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
IsoFile *file;
|
IsoFile *file;
|
||||||
|
|
||||||
ret = iso_file_source_stream_new(src, &stream);
|
ret = iso_file_source_stream_new(src, &stream);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
free(name);
|
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
|
||||||
/* take a ref to the src, as stream has taken our ref */
|
/* take a ref to the src, as stream has taken our ref */
|
||||||
iso_file_source_ref(src);
|
iso_file_source_ref(src);
|
||||||
|
|
||||||
file = calloc(1, sizeof(IsoFile));
|
file = calloc(1, sizeof(IsoFile));
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
free(name);
|
|
||||||
iso_stream_unref(stream);
|
iso_stream_unref(stream);
|
||||||
{ret = ISO_OUT_OF_MEM; goto ex;}
|
{ret = ISO_OUT_OF_MEM; goto ex;}
|
||||||
}
|
}
|
||||||
@ -2962,8 +3192,19 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
/*
|
/*
|
||||||
* and we set the sort weight based on the block on image, to
|
* and we set the sort weight based on the block on image, to
|
||||||
* improve performance on image modifying.
|
* improve performance on image modifying.
|
||||||
|
*
|
||||||
|
* This was too obtrusive because it occupied the highest
|
||||||
|
* possible weight ranks:
|
||||||
|
* file->sort_weight = INT_MAX - data->sections[0].block;
|
||||||
|
*
|
||||||
|
* So a try to be more nice and rely on caching with tiles
|
||||||
|
* of at least 16 blocks. This occupies a range within
|
||||||
|
* the interval of 1 to 2 exp 28 = 268,435,456.
|
||||||
|
* (Dividing each number separately saves from integer
|
||||||
|
* rollover problems.)
|
||||||
*/
|
*/
|
||||||
file->sort_weight = INT_MAX - data->sections[0].block;
|
file->sort_weight =
|
||||||
|
fsdata->nblocks / 16 - data->sections[0].block / 16 + 1;
|
||||||
|
|
||||||
file->stream = stream;
|
file->stream = stream;
|
||||||
file->node.type = LIBISO_FILE;
|
file->node.type = LIBISO_FILE;
|
||||||
@ -2975,7 +3216,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
data->block_size_log2,
|
data->block_size_log2,
|
||||||
data->uncompressed_size, 0);
|
data->uncompressed_size, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(name);
|
|
||||||
iso_stream_unref(stream);
|
iso_stream_unref(stream);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
@ -3006,7 +3246,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0,
|
ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0,
|
||||||
"More than one ISO node has been found for the same boot image.");
|
"More than one ISO node has been found for the same boot image.");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(name);
|
|
||||||
iso_stream_unref(stream);
|
iso_stream_unref(stream);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
@ -3024,7 +3263,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
/* source is a directory */
|
/* source is a directory */
|
||||||
new = calloc(1, sizeof(IsoDir));
|
new = calloc(1, sizeof(IsoDir));
|
||||||
if (new == NULL) {
|
if (new == NULL) {
|
||||||
free(name);
|
|
||||||
{ret = ISO_OUT_OF_MEM; goto ex;}
|
{ret = ISO_OUT_OF_MEM; goto ex;}
|
||||||
}
|
}
|
||||||
new->type = LIBISO_DIR;
|
new->type = LIBISO_DIR;
|
||||||
@ -3040,12 +3278,10 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
|
|
||||||
ret = iso_file_source_readlink(src, dest, LIBISOFS_NODE_PATH_MAX);
|
ret = iso_file_source_readlink(src, dest, LIBISOFS_NODE_PATH_MAX);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
free(name);
|
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
link = calloc(1, sizeof(IsoSymlink));
|
link = calloc(1, sizeof(IsoSymlink));
|
||||||
if (link == NULL) {
|
if (link == NULL) {
|
||||||
free(name);
|
|
||||||
{ret = ISO_OUT_OF_MEM; goto ex;}
|
{ret = ISO_OUT_OF_MEM; goto ex;}
|
||||||
}
|
}
|
||||||
link->dest = strdup(dest);
|
link->dest = strdup(dest);
|
||||||
@ -3066,8 +3302,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
IsoSpecial *special;
|
IsoSpecial *special;
|
||||||
special = calloc(1, sizeof(IsoSpecial));
|
special = calloc(1, sizeof(IsoSpecial));
|
||||||
if (special == NULL) {
|
if (special == NULL) {
|
||||||
free(name);
|
ret = ISO_OUT_OF_MEM; goto ex;
|
||||||
{ret = ISO_OUT_OF_MEM; goto ex;}
|
|
||||||
}
|
}
|
||||||
special->dev = info.st_rdev;
|
special->dev = info.st_rdev;
|
||||||
special->node.type = LIBISO_SPECIAL;
|
special->node.type = LIBISO_SPECIAL;
|
||||||
@ -3078,11 +3313,12 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
new->refcount = 0;
|
new->refcount = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ret = ISO_BAD_ISO_FILETYPE; goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fill fields */
|
/* fill fields */
|
||||||
new->refcount++;
|
new->refcount++;
|
||||||
new->name = name;
|
new->name = name; name = NULL;
|
||||||
new->mode = info.st_mode;
|
new->mode = info.st_mode;
|
||||||
new->uid = info.st_uid;
|
new->uid = info.st_uid;
|
||||||
new->gid = info.st_gid;
|
new->gid = info.st_gid;
|
||||||
@ -3097,7 +3333,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
|
|
||||||
ret = src_aa_to_node(src, new, 0);
|
ret = src_aa_to_node(src, new, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto failure;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attach ino as xinfo if valid and no IsoStream is involved */
|
/* Attach ino as xinfo if valid and no IsoStream is involved */
|
||||||
@ -3105,18 +3341,17 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
|||||||
!fsdata->make_new_ino) {
|
!fsdata->make_new_ino) {
|
||||||
ret = iso_node_set_ino(new, info.st_ino, 0);
|
ret = iso_node_set_ino(new, info.st_ino, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto failure;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
*node = new;
|
*node = new; new = NULL;
|
||||||
{ret = ISO_SUCCESS; goto ex;}
|
{ret = ISO_SUCCESS; goto ex;}
|
||||||
|
|
||||||
failure:;
|
ex:;
|
||||||
/* todo: stuff any possible memory leak here */
|
|
||||||
if (name != NULL)
|
if (name != NULL)
|
||||||
free(name);
|
free(name);
|
||||||
free(new);
|
if (new != NULL)
|
||||||
ex:;
|
iso_node_unref(new);
|
||||||
LIBISO_FREE_MEM(dest);
|
LIBISO_FREE_MEM(dest);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -3239,13 +3474,14 @@ static
|
|||||||
int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
||||||
IsoDataSource *src, uint32_t iso_image_size, int flag)
|
IsoDataSource *src, uint32_t iso_image_size, int flag)
|
||||||
{
|
{
|
||||||
int i, ret, section_count, todo, chunk;
|
int i, j, ret, section_count, todo, chunk;
|
||||||
uint32_t img_lba, img_size, boot_pvd_found, image_pvd, alleged_size;
|
uint32_t img_lba, img_size, boot_pvd_found, image_pvd, alleged_size;
|
||||||
struct iso_file_section *sections = NULL;
|
struct iso_file_section *sections = NULL;
|
||||||
struct el_torito_boot_image *boot;
|
struct el_torito_boot_image *boot;
|
||||||
uint8_t *boot_image_buf = NULL, boot_info_found[16], *buf = NULL;
|
uint8_t *boot_image_buf = NULL, boot_info_found[16], *buf = NULL;
|
||||||
IsoStream *stream = NULL;
|
IsoStream *stream = NULL;
|
||||||
IsoFile *boot_file;
|
IsoFile *boot_file;
|
||||||
|
uint64_t blk;
|
||||||
|
|
||||||
if (image->bootcat == NULL)
|
if (image->bootcat == NULL)
|
||||||
{ret = ISO_SUCCESS; goto ex;}
|
{ret = ISO_SUCCESS; goto ex;}
|
||||||
@ -3254,6 +3490,7 @@ int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
|||||||
boot = image->bootcat->bootimages[i];
|
boot = image->bootcat->bootimages[i];
|
||||||
boot_file = boot->image;
|
boot_file = boot->image;
|
||||||
boot->seems_boot_info_table = 0;
|
boot->seems_boot_info_table = 0;
|
||||||
|
boot->seems_grub2_boot_info = 0;
|
||||||
img_size = iso_file_get_size(boot_file);
|
img_size = iso_file_get_size(boot_file);
|
||||||
if (img_size > Libisofs_boot_image_max_sizE || img_size < 64)
|
if (img_size > Libisofs_boot_image_max_sizE || img_size < 64)
|
||||||
continue;
|
continue;
|
||||||
@ -3319,6 +3556,16 @@ int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
|||||||
goto ex;
|
goto ex;
|
||||||
if (memcmp(boot_image_buf + 8, boot_info_found, 16) == 0)
|
if (memcmp(boot_image_buf + 8, boot_info_found, 16) == 0)
|
||||||
boot->seems_boot_info_table = 1;
|
boot->seems_boot_info_table = 1;
|
||||||
|
|
||||||
|
if (img_size >= Libisofs_grub2_elto_patch_poS + 8) {
|
||||||
|
blk = 0;
|
||||||
|
for (j = Libisofs_grub2_elto_patch_poS + 7;
|
||||||
|
j >= Libisofs_grub2_elto_patch_poS; j--)
|
||||||
|
blk = (blk << 8) | boot_image_buf[j];
|
||||||
|
if (blk == img_lba * 4 + Libisofs_grub2_elto_patch_offsT)
|
||||||
|
boot->seems_grub2_boot_info = 1;
|
||||||
|
}
|
||||||
|
|
||||||
free(boot_image_buf);
|
free(boot_image_buf);
|
||||||
boot_image_buf = NULL;
|
boot_image_buf = NULL;
|
||||||
}
|
}
|
||||||
@ -3332,6 +3579,22 @@ ex:;
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void issue_collision_warning_summary(size_t failures)
|
||||||
|
{
|
||||||
|
if (failures > ISO_IMPORT_COLL_WARN_MAX) {
|
||||||
|
iso_msg_submit(-1, ISO_IMPORT_COLLISION, 0,
|
||||||
|
"More file name collisions had to be resolved");
|
||||||
|
}
|
||||||
|
if (failures > 0) {
|
||||||
|
iso_msg_submit(-1, ISO_IMPORT_COLLISION, 0,
|
||||||
|
"Sum of resolved file name collisions: %.f",
|
||||||
|
(double) failures);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int iso_image_import(IsoImage *image, IsoDataSource *src,
|
int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||||
struct iso_read_opts *opts,
|
struct iso_read_opts *opts,
|
||||||
IsoReadImageFeatures **features)
|
IsoReadImageFeatures **features)
|
||||||
@ -3475,12 +3738,13 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
|
|
||||||
/* recursively add image */
|
/* recursively add image */
|
||||||
ret = iso_add_dir_src_rec(image, image->root, newroot);
|
ret = iso_add_dir_src_rec(image, image->root, newroot);
|
||||||
|
|
||||||
/* error during recursive image addition? */
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
/* error during recursive image addition */
|
||||||
iso_node_builder_unref(image->builder);
|
iso_node_builder_unref(image->builder);
|
||||||
goto import_revert;
|
goto import_revert;
|
||||||
}
|
}
|
||||||
|
issue_ucs2_warning_summary(data->joliet_ucs2_failures);
|
||||||
|
issue_collision_warning_summary(image->collision_warnings);
|
||||||
|
|
||||||
/* Take over inode management from IsoImageFilesystem.
|
/* Take over inode management from IsoImageFilesystem.
|
||||||
data->inode_counter is supposed to hold the maximum PX inode number.
|
data->inode_counter is supposed to hold the maximum PX inode number.
|
||||||
@ -3514,7 +3778,7 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
goto import_revert;
|
goto import_revert;
|
||||||
}
|
}
|
||||||
ret = image_builder_create_node(image->builder, image, boot_src,
|
ret = image_builder_create_node(image->builder, image, boot_src,
|
||||||
&node);
|
NULL, &node);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
iso_node_builder_unref(image->builder);
|
iso_node_builder_unref(image->builder);
|
||||||
goto import_revert;
|
goto import_revert;
|
||||||
@ -3524,7 +3788,7 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
/* warn about hidden images */
|
/* warn about hidden images */
|
||||||
iso_msg_submit(image->id, ISO_EL_TORITO_HIDDEN, 0,
|
iso_msg_submit(image->id, ISO_EL_TORITO_HIDDEN, 0,
|
||||||
"Found hidden El-Torito image. Its size could not "
|
"Found hidden El-Torito image. Its size could not "
|
||||||
"be figure out, so image modify or boot image "
|
"be figured out, so image modify or boot image "
|
||||||
"patching may lead to bad results.");
|
"patching may lead to bad results.");
|
||||||
}
|
}
|
||||||
if (image->bootcat->node == NULL) {
|
if (image->bootcat->node == NULL) {
|
||||||
@ -3566,6 +3830,8 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
iso_image_set_copyright_file_id(image, data->copyright_file_id);
|
iso_image_set_copyright_file_id(image, data->copyright_file_id);
|
||||||
iso_image_set_abstract_file_id(image, data->abstract_file_id);
|
iso_image_set_abstract_file_id(image, data->abstract_file_id);
|
||||||
iso_image_set_biblio_file_id(image, data->biblio_file_id);
|
iso_image_set_biblio_file_id(image, data->biblio_file_id);
|
||||||
|
iso_image_set_pvd_times(image, data->creation_time,
|
||||||
|
data->modification_time, data->expiration_time, data->effective_time);
|
||||||
|
|
||||||
if (features != NULL) {
|
if (features != NULL) {
|
||||||
*features = malloc(sizeof(IsoReadImageFeatures));
|
*features = malloc(sizeof(IsoReadImageFeatures));
|
||||||
|
@ -115,8 +115,8 @@ uint8_t get_class (uint16_t v)
|
|||||||
return hfsplus_class_pages[high][low];
|
return hfsplus_class_pages[high][low];
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
int iso_get_hfsplus_name(char *input_charset, int imgid, char *name,
|
||||||
int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
uint16_t **result, uint32_t *result_len, uint16_t **cmp_name)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
uint16_t *ucs_name, *iptr, *optr;
|
uint16_t *ucs_name, *iptr, *optr;
|
||||||
@ -128,19 +128,19 @@ int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = str2ucs(t->input_charset, name, &ucs_name);
|
ret = str2utf16be(input_charset, name, &ucs_name);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
iso_msg_debug(t->image->id, "Can't convert %s", name);
|
iso_msg_debug(imgid, "Cannot convert '%s'", name);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
curlen = ucslen (ucs_name);
|
curlen = ucslen (ucs_name);
|
||||||
node->name = calloc ((curlen * HFSPLUS_MAX_DECOMPOSE_LEN + 1),
|
*result = calloc ((curlen * HFSPLUS_MAX_DECOMPOSE_LEN + 1),
|
||||||
sizeof (node->name[0]));
|
sizeof (uint16_t));
|
||||||
if (!node->name)
|
if (*result == NULL)
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
|
|
||||||
for (iptr = ucs_name, optr = node->name; *iptr; iptr++)
|
for (iptr = ucs_name, optr = *result; *iptr; iptr++)
|
||||||
{
|
{
|
||||||
const uint16_t *dptr;
|
const uint16_t *dptr;
|
||||||
uint16_t val = iso_ntohs (*iptr);
|
uint16_t val = iso_ntohs (*iptr);
|
||||||
@ -189,7 +189,7 @@ int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
|||||||
if (!ucs_name[0])
|
if (!ucs_name[0])
|
||||||
break;
|
break;
|
||||||
last_class = get_class (ucs_name[0]);
|
last_class = get_class (ucs_name[0]);
|
||||||
for (optr = node->name + 1; *optr; optr++)
|
for (optr = *result + 1; *optr; optr++)
|
||||||
{
|
{
|
||||||
uint8_t new_class = get_class (*optr);
|
uint8_t new_class = get_class (*optr);
|
||||||
|
|
||||||
@ -207,11 +207,11 @@ int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
|||||||
}
|
}
|
||||||
while (done);
|
while (done);
|
||||||
|
|
||||||
node->cmp_name = calloc ((ucslen (node->name) + 1), sizeof (node->cmp_name[0]));
|
*cmp_name = calloc ((ucslen (*result) + 1), sizeof (uint16_t));
|
||||||
if (!node->cmp_name)
|
if (*cmp_name == NULL)
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
|
|
||||||
for (iptr = node->name, optr = node->cmp_name; *iptr; iptr++)
|
for (iptr = *result, optr = *cmp_name; *iptr; iptr++)
|
||||||
{
|
{
|
||||||
*optr = iso_hfsplus_cichar(*iptr);
|
*optr = iso_hfsplus_cichar(*iptr);
|
||||||
if (*optr != 0)
|
if (*optr != 0)
|
||||||
@ -221,10 +221,19 @@ int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
|||||||
|
|
||||||
free (ucs_name);
|
free (ucs_name);
|
||||||
|
|
||||||
node->strlen = ucslen (node->name);
|
*result_len = ucslen (*result);
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int set_hfsplus_name(Ecma119Image *t, char *name, HFSPlusNode *node)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = iso_get_hfsplus_name(t->input_charset, t->image->id, name,
|
||||||
|
&(node->name), &(node->strlen), &(node->cmp_name));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* >>> ts B20617
|
/* >>> ts B20617
|
||||||
This should be HFSPlusNode rather than IsoNode in order to have access
|
This should be HFSPlusNode rather than IsoNode in order to have access
|
||||||
@ -429,7 +438,7 @@ int hfsplus_tail_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
block_size = t->hfsp_block_size;
|
block_size = t->opts->hfsp_block_size;
|
||||||
block_fac = t->hfsp_iso_block_fac;
|
block_fac = t->hfsp_iso_block_fac;
|
||||||
|
|
||||||
#ifdef Libisofs_ts_debuG
|
#ifdef Libisofs_ts_debuG
|
||||||
@ -477,17 +486,16 @@ static
|
|||||||
int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer)
|
int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||||
{
|
{
|
||||||
Ecma119Image *t;
|
Ecma119Image *t;
|
||||||
uint32_t i, link_blocks, hfsp_curblock;
|
uint32_t i, hfsp_curblock;
|
||||||
uint32_t block_fac, cat_node_size, block_size;
|
uint32_t block_fac, block_size;
|
||||||
|
|
||||||
if (writer == NULL) {
|
if (writer == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
block_size = t->hfsp_block_size;
|
block_size = t->opts->hfsp_block_size;
|
||||||
block_fac = t->hfsp_iso_block_fac;
|
block_fac = t->hfsp_iso_block_fac;
|
||||||
cat_node_size = t->hfsp_cat_node_size;
|
|
||||||
|
|
||||||
iso_msg_debug(t->image->id, "(b) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes);
|
iso_msg_debug(t->image->id, "(b) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes);
|
||||||
t->hfsp_part_start = t->curblock * block_fac;
|
t->hfsp_part_start = t->curblock * block_fac;
|
||||||
@ -500,7 +508,7 @@ int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t->hfsp_catalog_file_start = hfsp_curblock;
|
t->hfsp_catalog_file_start = hfsp_curblock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
hfsp_curblock += (t->hfsp_nnodes * cat_node_size + block_size - 1) / block_size;
|
hfsp_curblock += (t->hfsp_nnodes * t->hfsp_cat_node_size + block_size - 1) / block_size;
|
||||||
*/
|
*/
|
||||||
hfsp_curblock += 2 * t->hfsp_nnodes;
|
hfsp_curblock += 2 * t->hfsp_nnodes;
|
||||||
|
|
||||||
@ -509,7 +517,6 @@ int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
|
|
||||||
iso_msg_debug(t->image->id, "(d) hfsp_curblock=%d, nodes =%d", hfsp_curblock, t->hfsp_nnodes);
|
iso_msg_debug(t->image->id, "(d) hfsp_curblock=%d, nodes =%d", hfsp_curblock, t->hfsp_nnodes);
|
||||||
|
|
||||||
link_blocks = 0;
|
|
||||||
for (i = 0; i < t->hfsp_nleafs; i++)
|
for (i = 0; i < t->hfsp_nleafs; i++)
|
||||||
if (t->hfsp_leafs[i].unix_type == UNIX_SYMLINK)
|
if (t->hfsp_leafs[i].unix_type == UNIX_SYMLINK)
|
||||||
{
|
{
|
||||||
@ -584,7 +591,7 @@ write_sb (Ecma119Image *t)
|
|||||||
|
|
||||||
iso_msg_debug(t->image->id, "Write HFS+ superblock");
|
iso_msg_debug(t->image->id, "Write HFS+ superblock");
|
||||||
|
|
||||||
block_size = t->hfsp_block_size;
|
block_size = t->opts->hfsp_block_size;
|
||||||
|
|
||||||
memset (buffer, 0, sizeof (buffer));
|
memset (buffer, 0, sizeof (buffer));
|
||||||
ret = iso_write(t, buffer, 1024);
|
ret = iso_write(t, buffer, 1024);
|
||||||
@ -644,7 +651,7 @@ write_sb (Ecma119Image *t)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy (&sb.num_serial, &t->hfsp_serial_number, 8);
|
memcpy (&sb.num_serial, &t->opts->hfsp_serial_number, 8);
|
||||||
ret = iso_write(t, &sb, sizeof (sb));
|
ret = iso_write(t, &sb, sizeof (sb));
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -667,7 +674,7 @@ int hfsplus_writer_write_data(IsoImageWriter *writer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
block_size = t->hfsp_block_size;
|
block_size = t->opts->hfsp_block_size;
|
||||||
block_fac = t->hfsp_iso_block_fac;
|
block_fac = t->hfsp_iso_block_fac;
|
||||||
cat_node_size = t->hfsp_cat_node_size;
|
cat_node_size = t->hfsp_cat_node_size;
|
||||||
|
|
||||||
@ -1035,7 +1042,7 @@ int hfsplus_tail_writer_write_data(IsoImageWriter *writer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
block_size = t->hfsp_block_size;
|
block_size = t->opts->hfsp_block_size;
|
||||||
|
|
||||||
#ifdef Libisofs_ts_debuG
|
#ifdef Libisofs_ts_debuG
|
||||||
iso_msg_debug(t->image->id, "hfsplus tail writer writes at = %.f",
|
iso_msg_debug(t->image->id, "hfsplus tail writer writes at = %.f",
|
||||||
@ -1193,7 +1200,7 @@ int subst_symlink_dest_comp(Ecma119Image *target, uint32_t idx,
|
|||||||
wpt += *comp_start - *dest;
|
wpt += *comp_start - *dest;
|
||||||
memcpy(wpt, new_name, new_len);
|
memcpy(wpt, new_name, new_len);
|
||||||
wpt += new_len;
|
wpt += new_len;
|
||||||
if (*comp_end - *dest < *dest_len)
|
if ((unsigned int) (*comp_end - *dest) < *dest_len)
|
||||||
memcpy(wpt, *comp_end, *dest_len - (*comp_end - *dest));
|
memcpy(wpt, *comp_end, *dest_len - (*comp_end - *dest));
|
||||||
wpt += *dest_len - (*comp_end - *dest);
|
wpt += *dest_len - (*comp_end - *dest);
|
||||||
*wpt = 0;
|
*wpt = 0;
|
||||||
@ -1227,7 +1234,7 @@ int update_symlink(Ecma119Image *target, uint32_t changed_idx, char *new_name,
|
|||||||
char *orig_dest, *orig_start, *orig_end;
|
char *orig_dest, *orig_start, *orig_end;
|
||||||
char *hfsp_dest, *hfsp_start, *hfsp_end;
|
char *hfsp_dest, *hfsp_start, *hfsp_end;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned int comp_len, orig_len, hfsp_len, hfsp_comp_len;
|
unsigned int comp_len, orig_len, hfsp_len;
|
||||||
|
|
||||||
if (target->hfsp_leafs[link_idx].node->type != LIBISO_SYMLINK)
|
if (target->hfsp_leafs[link_idx].node->type != LIBISO_SYMLINK)
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
@ -1271,7 +1278,6 @@ int update_symlink(Ecma119Image *target, uint32_t changed_idx, char *new_name,
|
|||||||
hfsp_end = strchr(hfsp_start, '/');
|
hfsp_end = strchr(hfsp_start, '/');
|
||||||
if (hfsp_end == NULL)
|
if (hfsp_end == NULL)
|
||||||
hfsp_end = hfsp_start + strlen(hfsp_start);
|
hfsp_end = hfsp_start + strlen(hfsp_start);
|
||||||
hfsp_comp_len = hfsp_end - hfsp_start;
|
|
||||||
|
|
||||||
if (comp_len == 0 || (comp_len == 1 && orig_start[0] == '.'))
|
if (comp_len == 0 || (comp_len == 1 && orig_start[0] == '.'))
|
||||||
continue;
|
continue;
|
||||||
@ -1582,10 +1588,10 @@ int hfsplus_writer_create(Ecma119Image *target)
|
|||||||
make_hfsplus_decompose_pages();
|
make_hfsplus_decompose_pages();
|
||||||
make_hfsplus_class_pages();
|
make_hfsplus_class_pages();
|
||||||
|
|
||||||
if (target->hfsp_block_size == 0)
|
if (target->opts->hfsp_block_size == 0)
|
||||||
target->hfsp_block_size = HFSPLUS_DEFAULT_BLOCK_SIZE;
|
target->opts->hfsp_block_size = HFSPLUS_DEFAULT_BLOCK_SIZE;
|
||||||
target->hfsp_cat_node_size = 2 * target->hfsp_block_size;
|
target->hfsp_cat_node_size = 2 * target->opts->hfsp_block_size;
|
||||||
target->hfsp_iso_block_fac = 2048 / target->hfsp_block_size;
|
target->hfsp_iso_block_fac = 2048 / target->opts->hfsp_block_size;
|
||||||
cat_node_size = target->hfsp_cat_node_size;
|
cat_node_size = target->hfsp_cat_node_size;
|
||||||
|
|
||||||
writer->compute_data_blocks = hfsplus_writer_compute_data_blocks;
|
writer->compute_data_blocks = hfsplus_writer_compute_data_blocks;
|
||||||
|
@ -194,4 +194,8 @@ void make_hfsplus_class_pages();
|
|||||||
|
|
||||||
extern const uint16_t hfsplus_casefold[];
|
extern const uint16_t hfsplus_casefold[];
|
||||||
|
|
||||||
|
int iso_get_hfsplus_name(char *input_charset, int imgid, char *name,
|
||||||
|
uint16_t **result, uint32_t *result_len, uint16_t **cmp_name);
|
||||||
|
|
||||||
|
|
||||||
#endif /* LIBISO_HFSPLUS_H */
|
#endif /* LIBISO_HFSPLUS_H */
|
||||||
|
236
libisofs/image.c
236
libisofs/image.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2012 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -78,11 +78,18 @@ int iso_image_new(const char *name, IsoImage **image)
|
|||||||
img->volset_id = strdup(name);
|
img->volset_id = strdup(name);
|
||||||
img->volume_id = strdup(name);
|
img->volume_id = strdup(name);
|
||||||
}
|
}
|
||||||
|
memset(img->application_use, 0, 512);
|
||||||
img->system_area_data = NULL;
|
img->system_area_data = NULL;
|
||||||
img->system_area_options = 0;
|
img->system_area_options = 0;
|
||||||
img->num_mips_boot_files = 0;
|
img->num_mips_boot_files = 0;
|
||||||
for (i = 0; i < 15; i++)
|
for (i = 0; i < 15; i++)
|
||||||
img->mips_boot_file_paths[i] = NULL;
|
img->mips_boot_file_paths[i] = NULL;
|
||||||
|
img->sparc_core_node = NULL;
|
||||||
|
img->hppa_cmdline= NULL;
|
||||||
|
img->hppa_bootloader= NULL;
|
||||||
|
img->hppa_kernel_32= NULL;
|
||||||
|
img->hppa_kernel_64= NULL;
|
||||||
|
img->hppa_ramdisk= NULL;
|
||||||
img->builder_ignore_acl = 1;
|
img->builder_ignore_acl = 1;
|
||||||
img->builder_ignore_ea = 1;
|
img->builder_ignore_ea = 1;
|
||||||
img->inode_counter = 0;
|
img->inode_counter = 0;
|
||||||
@ -95,6 +102,7 @@ int iso_image_new(const char *name, IsoImage **image)
|
|||||||
img->generator_is_running = 0;
|
img->generator_is_running = 0;
|
||||||
for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++)
|
for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++)
|
||||||
img->hfsplus_blessed[i] = NULL;
|
img->hfsplus_blessed[i] = NULL;
|
||||||
|
img->collision_warnings = 0;
|
||||||
|
|
||||||
*image = img;
|
*image = img;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
@ -136,6 +144,15 @@ void iso_image_unref(IsoImage *image)
|
|||||||
iso_filesystem_unref(image->fs);
|
iso_filesystem_unref(image->fs);
|
||||||
el_torito_boot_catalog_free(image->bootcat);
|
el_torito_boot_catalog_free(image->bootcat);
|
||||||
iso_image_give_up_mips_boot(image, 0);
|
iso_image_give_up_mips_boot(image, 0);
|
||||||
|
if (image->sparc_core_node != NULL)
|
||||||
|
iso_node_unref((IsoNode *) image->sparc_core_node);
|
||||||
|
|
||||||
|
#ifdef Libisofs_enable_unreleased_hppa_palO
|
||||||
|
|
||||||
|
iso_image_set_hppa_palo(image, NULL, NULL, NULL, NULL, NULL, 1);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
free(image->volset_id);
|
free(image->volset_id);
|
||||||
free(image->volume_id);
|
free(image->volume_id);
|
||||||
free(image->publisher_id);
|
free(image->publisher_id);
|
||||||
@ -145,6 +162,10 @@ void iso_image_unref(IsoImage *image)
|
|||||||
free(image->copyright_file_id);
|
free(image->copyright_file_id);
|
||||||
free(image->abstract_file_id);
|
free(image->abstract_file_id);
|
||||||
free(image->biblio_file_id);
|
free(image->biblio_file_id);
|
||||||
|
free(image->creation_time);
|
||||||
|
free(image->modification_time);
|
||||||
|
free(image->expiration_time);
|
||||||
|
free(image->effective_time);
|
||||||
if (image->used_inodes != NULL)
|
if (image->used_inodes != NULL)
|
||||||
free(image->used_inodes);
|
free(image->used_inodes);
|
||||||
if (image->system_area_data != NULL)
|
if (image->system_area_data != NULL)
|
||||||
@ -335,6 +356,55 @@ const char *iso_image_get_biblio_file_id(const IsoImage *image)
|
|||||||
return image->biblio_file_id;
|
return image->biblio_file_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iso_image_set_pvd_times(IsoImage *image,
|
||||||
|
char *creation_time, char *modification_time,
|
||||||
|
char *expiration_time, char *effective_time)
|
||||||
|
{
|
||||||
|
if (creation_time == NULL || modification_time == NULL ||
|
||||||
|
expiration_time == NULL || effective_time == NULL)
|
||||||
|
return ISO_NULL_POINTER;
|
||||||
|
image->creation_time = calloc(18, 1); /* Surely including a trailing 0 */
|
||||||
|
image->modification_time = calloc(18, 1);
|
||||||
|
image->expiration_time = calloc(18, 1);
|
||||||
|
image->effective_time = calloc(18, 1);
|
||||||
|
if (image->creation_time == NULL || image->modification_time == NULL ||
|
||||||
|
image->expiration_time == NULL || image->effective_time == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
/* (If the string is too short, a non-zero timezone will not be stored) */
|
||||||
|
strncpy(image->creation_time, creation_time, 17);
|
||||||
|
strncpy(image->modification_time, modification_time, 17);
|
||||||
|
strncpy(image->expiration_time, expiration_time, 17);
|
||||||
|
strncpy(image->effective_time, effective_time, 17);
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int iso_image_get_pvd_times(IsoImage *image,
|
||||||
|
char **creation_time, char **modification_time,
|
||||||
|
char **expiration_time, char **effective_time)
|
||||||
|
{
|
||||||
|
if (image->creation_time == NULL || image->modification_time == NULL ||
|
||||||
|
image->expiration_time == NULL || image->effective_time == NULL)
|
||||||
|
return ISO_NULL_POINTER;
|
||||||
|
*creation_time = image->creation_time;
|
||||||
|
*modification_time = image->modification_time;
|
||||||
|
*expiration_time = image->expiration_time;
|
||||||
|
*effective_time = image->effective_time;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void iso_image_set_app_use(IsoImage *image, const char *app_use_data,
|
||||||
|
int count)
|
||||||
|
{
|
||||||
|
if (count < 0)
|
||||||
|
count= 0;
|
||||||
|
else if(count > 512)
|
||||||
|
count= 512;
|
||||||
|
if (count > 0)
|
||||||
|
memcpy(image->application_use, app_use_data, count);
|
||||||
|
if (count < 512)
|
||||||
|
memset(image->application_use + count, 0, 512 - count);
|
||||||
|
}
|
||||||
|
|
||||||
int iso_image_get_msg_id(IsoImage *image)
|
int iso_image_get_msg_id(IsoImage *image)
|
||||||
{
|
{
|
||||||
return image->id;
|
return image->id;
|
||||||
@ -354,21 +424,74 @@ static
|
|||||||
int dir_update_size(IsoImage *image, IsoDir *dir)
|
int dir_update_size(IsoImage *image, IsoDir *dir)
|
||||||
{
|
{
|
||||||
IsoNode *pos;
|
IsoNode *pos;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
#ifdef Libisofs_update_sizes_abortablE
|
||||||
|
char *path= NULL;
|
||||||
|
IsoStream *base_stream;
|
||||||
|
int cancel_ret, ret;
|
||||||
|
uint32_t lba;
|
||||||
|
#endif
|
||||||
|
|
||||||
pos = dir->children;
|
pos = dir->children;
|
||||||
while (pos) {
|
while (pos) {
|
||||||
int ret = 1;
|
|
||||||
if (pos->type == LIBISO_FILE) {
|
if (pos->type == LIBISO_FILE) {
|
||||||
ret = iso_stream_update_size(ISO_FILE(pos)->stream);
|
ret = iso_stream_update_size(ISO_FILE(pos)->stream);
|
||||||
} else if (pos->type == LIBISO_DIR) {
|
} else if (pos->type == LIBISO_DIR) {
|
||||||
/* recurse */
|
/* recurse */
|
||||||
ret = dir_update_size(image, ISO_DIR(pos));
|
ret = dir_update_size(image, ISO_DIR(pos));
|
||||||
|
|
||||||
|
#ifdef Libisofs_update_sizes_abortablE
|
||||||
|
if (ret == ISO_CANCELED)
|
||||||
|
return ret; /* Message already issued by dir_update_size */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Libisofs_update_sizes_abortablE
|
||||||
|
|
||||||
|
/* This would report error and abort according to severity threshold.
|
||||||
|
But it is desirable to let the update_size crawler continue
|
||||||
|
its work after e.g. a file has vanished from hard disk.
|
||||||
|
So normally this macro case should be disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = iso_msg_submit(image->id, ret, 0, NULL);
|
cancel_ret = iso_msg_submit(image->id, ret, 0, NULL);
|
||||||
if (ret < 0) {
|
path = iso_tree_get_node_path(pos);
|
||||||
return ret; /* cancel due error threshold */
|
if (path != NULL) {
|
||||||
|
iso_msg_submit(image->id, ret, 0,
|
||||||
|
"ISO path : %s", path);
|
||||||
|
free(path);
|
||||||
}
|
}
|
||||||
|
/* Report source path with streams which do not come from
|
||||||
|
the loaded ISO filesystem */
|
||||||
|
if (pos->type == LIBISO_FILE &&
|
||||||
|
iso_node_get_old_image_lba(pos, &lba, 0) == 0) {
|
||||||
|
base_stream = iso_stream_get_input_stream(
|
||||||
|
ISO_FILE(pos)->stream, 1);
|
||||||
|
if (base_stream == NULL)
|
||||||
|
base_stream = ISO_FILE(pos)->stream;
|
||||||
|
path = iso_stream_get_source_path(base_stream, 0);
|
||||||
|
if (path != NULL) {
|
||||||
|
iso_msg_submit(image->id, ret, 0,
|
||||||
|
"Local path: %s", path);
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cancel_ret < 0)
|
||||||
|
return cancel_ret; /* cancel due error threshold */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
ret = 1; /* ignore error */
|
||||||
|
|
||||||
|
#endif /* ! Libisofs_update_sizes_abortablE */
|
||||||
|
|
||||||
pos = pos->next;
|
pos = pos->next;
|
||||||
}
|
}
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
@ -732,3 +855,106 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* API */
|
||||||
|
int iso_image_set_sparc_core(IsoImage *img, IsoFile *sparc_core, int flag)
|
||||||
|
{
|
||||||
|
if (img->sparc_core_node != NULL)
|
||||||
|
iso_node_unref((IsoNode *) img->sparc_core_node);
|
||||||
|
img->sparc_core_node = sparc_core;
|
||||||
|
if (sparc_core != NULL)
|
||||||
|
iso_node_ref((IsoNode *) sparc_core);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* API */
|
||||||
|
int iso_image_get_sparc_core(IsoImage *img, IsoFile **sparc_core, int flag)
|
||||||
|
{
|
||||||
|
*sparc_core = img->sparc_core_node;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @param flag
|
||||||
|
bit0= Let NULL parameters free the corresponding image properties.
|
||||||
|
Else only the non-NULL parameters of this call have an effect.
|
||||||
|
*/
|
||||||
|
static int hppa_palo_set_path(IsoImage *img, char *path, char **target,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
IsoNode *node;
|
||||||
|
IsoFile *file;
|
||||||
|
|
||||||
|
if (path == NULL && !(flag & 1))
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
if (iso_clone_mgtd_mem(path, target, 0) < 0)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
if (path == NULL)
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
ret = iso_tree_path_to_node(img, path, &node);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret == 0) {
|
||||||
|
iso_msg_submit(img->id, ISO_BOOT_FILE_MISSING, 0,
|
||||||
|
"Cannot find in ISO image: HP-PA file '%s'", path);
|
||||||
|
return ISO_BOOT_FILE_MISSING;
|
||||||
|
}
|
||||||
|
if (iso_node_get_type(node) != LIBISO_FILE) {
|
||||||
|
iso_msg_submit(img->id, ISO_HPPA_PALO_NOTREG, 0,
|
||||||
|
"HP-PA PALO file is not a data file: '%s'", path);
|
||||||
|
return ISO_HPPA_PALO_NOTREG;
|
||||||
|
}
|
||||||
|
file = (IsoFile *) node;
|
||||||
|
if (!file->explicit_weight)
|
||||||
|
file->sort_weight = 2;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* API */
|
||||||
|
/* @param flag
|
||||||
|
Bitfield for control purposes
|
||||||
|
bit0= Let NULL parameters free the corresponding image properties.
|
||||||
|
Else only the non-NULL parameters of this call have an effect.
|
||||||
|
*/
|
||||||
|
int iso_image_set_hppa_palo(IsoImage *img, char *cmdline, char *bootloader,
|
||||||
|
char *kernel_32, char *kernel_64, char *ramdisk,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (cmdline != NULL || (flag & 1))
|
||||||
|
if (iso_clone_mgtd_mem(cmdline, &(img->hppa_cmdline), 0) < 0)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
ret = hppa_palo_set_path(img, bootloader, &(img->hppa_bootloader),
|
||||||
|
flag & 1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
ret = hppa_palo_set_path(img, kernel_32, &(img->hppa_kernel_32), flag & 1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
ret = hppa_palo_set_path(img, kernel_64, &(img->hppa_kernel_64), flag & 1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
ret = hppa_palo_set_path(img, ramdisk, &(img->hppa_ramdisk), flag & 1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* API */
|
||||||
|
int iso_image_get_hppa_palo(IsoImage *img, char **cmdline, char **bootloader,
|
||||||
|
char **kernel_32, char **kernel_64, char **ramdisk)
|
||||||
|
{
|
||||||
|
*cmdline = img->hppa_cmdline;
|
||||||
|
*bootloader = img->hppa_bootloader;
|
||||||
|
*kernel_32 = img->hppa_kernel_32;
|
||||||
|
*kernel_64 = img->hppa_kernel_64;
|
||||||
|
*ramdisk = img->hppa_ramdisk;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2012 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -22,6 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
#define ISO_USED_INODE_RANGE (1 << 18)
|
#define ISO_USED_INODE_RANGE (1 << 18)
|
||||||
|
|
||||||
|
/* How many warnings to issue about name collisions during iso_image_import()
|
||||||
|
*/
|
||||||
|
#define ISO_IMPORT_COLL_WARN_MAX 10
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Image is a context for image manipulation.
|
* Image is a context for image manipulation.
|
||||||
@ -49,6 +52,11 @@ struct Iso_Image
|
|||||||
char *copyright_file_id;
|
char *copyright_file_id;
|
||||||
char *abstract_file_id;
|
char *abstract_file_id;
|
||||||
char *biblio_file_id;
|
char *biblio_file_id;
|
||||||
|
char *creation_time;
|
||||||
|
char *modification_time;
|
||||||
|
char *expiration_time;
|
||||||
|
char *effective_time;
|
||||||
|
char application_use[512];
|
||||||
|
|
||||||
/* el-torito boot catalog */
|
/* el-torito boot catalog */
|
||||||
struct el_torito_boot_catalog *bootcat;
|
struct el_torito_boot_catalog *bootcat;
|
||||||
@ -65,6 +73,20 @@ struct Iso_Image
|
|||||||
int num_mips_boot_files;
|
int num_mips_boot_files;
|
||||||
char *mips_boot_file_paths[15]; /* ISO 9660 Rock Ridge Paths */
|
char *mips_boot_file_paths[15]; /* ISO 9660 Rock Ridge Paths */
|
||||||
|
|
||||||
|
/* A data file of which the position and size shall be written after
|
||||||
|
a SUN Disk Label.
|
||||||
|
*/
|
||||||
|
IsoFile *sparc_core_node;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parameters for HP-PA PALO boot sector. cmdline is a string. The other
|
||||||
|
* four are absolute paths to data files in the ISO image.
|
||||||
|
*/
|
||||||
|
char *hppa_cmdline;
|
||||||
|
char *hppa_bootloader;
|
||||||
|
char *hppa_kernel_32;
|
||||||
|
char *hppa_kernel_64;
|
||||||
|
char *hppa_ramdisk;
|
||||||
|
|
||||||
/* image identifier, for message origin identifier */
|
/* image identifier, for message origin identifier */
|
||||||
int id;
|
int id;
|
||||||
@ -187,6 +209,9 @@ struct Iso_Image
|
|||||||
*/
|
*/
|
||||||
IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
|
IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
|
||||||
|
|
||||||
|
/* Counts the name collisions while iso_image_import() */
|
||||||
|
size_t collision_warnings;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -234,4 +259,8 @@ int iso_image_set_checksums(IsoImage *image, char *checksum_array,
|
|||||||
uint32_t idx_count, int flag);
|
uint32_t idx_count, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
int iso_image_set_pvd_times(IsoImage *image,
|
||||||
|
char *creation_time, char *modification_time,
|
||||||
|
char *expiration_time, char *effective_time);
|
||||||
|
|
||||||
#endif /*LIBISO_IMAGE_H_*/
|
#endif /*LIBISO_IMAGE_H_*/
|
||||||
|
@ -125,7 +125,7 @@ int create_node(Ecma119Image *t, IsoNode *iso, Iso1999Node **node)
|
|||||||
IsoFile *file = (IsoFile*) iso;
|
IsoFile *file = (IsoFile*) iso;
|
||||||
|
|
||||||
size = iso_stream_get_size(file->stream);
|
size = iso_stream_get_size(file->stream);
|
||||||
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->iso_level != 3) {
|
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->opts->iso_level != 3) {
|
||||||
char *ipath = iso_tree_get_node_path(iso);
|
char *ipath = iso_tree_get_node_path(iso);
|
||||||
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
|
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
|
||||||
"File \"%s\" can't be added to image because is "
|
"File \"%s\" can't be added to image because is "
|
||||||
@ -194,7 +194,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, Iso1999Node **tree, int pathlen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
max_path = pathlen + 1 + (iso_name ? strlen(iso_name): 0);
|
max_path = pathlen + 1 + (iso_name ? strlen(iso_name): 0);
|
||||||
if (!t->allow_longer_paths && max_path > 255) {
|
if (!t->opts->allow_longer_paths && max_path > 255) {
|
||||||
char *ipath = iso_tree_get_node_path(iso);
|
char *ipath = iso_tree_get_node_path(iso);
|
||||||
ret = iso_msg_submit(t->image->id, ISO_FILE_IMGPATH_WRONG, 0,
|
ret = iso_msg_submit(t->image->id, ISO_FILE_IMGPATH_WRONG, 0,
|
||||||
"File \"%s\" can't be added to ISO 9660:1999 tree, "
|
"File \"%s\" can't be added to ISO 9660:1999 tree, "
|
||||||
@ -308,7 +308,7 @@ int mangle_single_dir(Ecma119Image *img, Iso1999Node *dir)
|
|||||||
int ret;
|
int ret;
|
||||||
int i, nchildren;
|
int i, nchildren;
|
||||||
Iso1999Node **children;
|
Iso1999Node **children;
|
||||||
IsoHTable *table;
|
IsoHTable *table = NULL;
|
||||||
int need_sort = 0;
|
int need_sort = 0;
|
||||||
char *full_name = NULL, *tmp = NULL;
|
char *full_name = NULL, *tmp = NULL;
|
||||||
|
|
||||||
@ -722,13 +722,13 @@ void write_one_dir_record(Ecma119Image *t, Iso1999Node *node, int file_id,
|
|||||||
iso_bb(rec->block, block, 4);
|
iso_bb(rec->block, block, 4);
|
||||||
iso_bb(rec->length, len, 4);
|
iso_bb(rec->length, len, 4);
|
||||||
|
|
||||||
/* was: iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
/* was: iso_datetime_7(rec->recording_time, t->now, t->opts->always_gmt);
|
||||||
*/
|
*/
|
||||||
iso= node->node;
|
iso= node->node;
|
||||||
iso_datetime_7(rec->recording_time,
|
iso_datetime_7(rec->recording_time,
|
||||||
(t->dir_rec_mtime & 4) ? ( t->replace_timestamps ?
|
(t->opts->dir_rec_mtime & 4) ? ( t->replace_timestamps ?
|
||||||
t->timestamp : iso->mtime )
|
t->timestamp : iso->mtime )
|
||||||
: t->now, t->always_gmt);
|
: t->now, t->opts->always_gmt);
|
||||||
|
|
||||||
rec->flags[0] = ((node->type == ISO1999_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
rec->flags[0] = ((node->type == ISO1999_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
||||||
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
||||||
|
@ -28,31 +28,69 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static
|
/* @param flag bit0= Do not issue error messages
|
||||||
int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
|
*/
|
||||||
|
int iso_get_joliet_name(IsoWriteOpts *opts, char *input_charset, int imgid,
|
||||||
|
char *node_name, enum IsoNodeType node_type,
|
||||||
|
size_t *joliet_ucs2_failures,
|
||||||
|
uint16_t **name, int flag)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = ISO_SUCCESS;
|
||||||
uint16_t *ucs_name;
|
uint16_t *ucs_name = NULL, *utf16_name = NULL;
|
||||||
uint16_t *jname = NULL;
|
uint16_t *jname = NULL;
|
||||||
|
|
||||||
if (iso->name == NULL) {
|
if (node_name == NULL) {
|
||||||
/* it is not necessarily an error, it can be the root */
|
/* it is not necessarily an error, it can be the root */
|
||||||
|
*name = NULL;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = str2ucs(t->input_charset, iso->name, &ucs_name);
|
if (opts->joliet_utf16) {
|
||||||
if (ret < 0) {
|
ret = str2utf16be(input_charset, node_name, &ucs_name);
|
||||||
iso_msg_debug(t->image->id, "Can't convert %s", iso->name);
|
if (ret < 0) {
|
||||||
return ret;
|
if (!(flag & 512))
|
||||||
|
iso_msg_debug(imgid, "Cannot convert to UTF-16 : \"%s\"",
|
||||||
|
node_name);
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ret = str2ucs(input_charset, node_name, &ucs_name);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (!(flag & 512))
|
||||||
|
iso_msg_debug(imgid, "Cannot convert to UCS-2 : \"%s\"",
|
||||||
|
node_name);
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
ret = str2utf16be(input_charset, node_name, &utf16_name);
|
||||||
|
if (ret == ISO_SUCCESS) {
|
||||||
|
if (ucscmp(ucs_name, utf16_name) != 0) {
|
||||||
|
(*joliet_ucs2_failures)++;
|
||||||
|
if (*joliet_ucs2_failures <= ISO_JOLIET_UCS2_WARN_MAX &&
|
||||||
|
!(flag & 512)) {
|
||||||
|
iso_msg_submit(imgid, ISO_NAME_NOT_UCS2, 0,
|
||||||
|
"Filename not suitable for Joliet character set UCS-2 : \"%s\"",
|
||||||
|
node_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (iso->type == LIBISO_DIR) {
|
if (node_type == LIBISO_DIR) {
|
||||||
jname = iso_j_dir_id(ucs_name, t->joliet_long_names << 1);
|
jname = iso_j_dir_id(ucs_name, opts->joliet_long_names << 1);
|
||||||
} else {
|
} else {
|
||||||
jname = iso_j_file_id(ucs_name,
|
jname = iso_j_file_id(ucs_name,
|
||||||
(t->joliet_long_names << 1) | !!(t->no_force_dots & 2));
|
(opts->joliet_long_names << 1) | !!(opts->no_force_dots & 2));
|
||||||
}
|
}
|
||||||
free(ucs_name);
|
ret = ISO_SUCCESS;
|
||||||
if (jname != NULL) {
|
ex:;
|
||||||
|
if (ucs_name != NULL)
|
||||||
|
free(ucs_name);
|
||||||
|
if (utf16_name != NULL)
|
||||||
|
free(utf16_name);
|
||||||
|
if (ret != ISO_SUCCESS) {
|
||||||
|
if (jname != NULL)
|
||||||
|
free(jname);
|
||||||
|
return ret;
|
||||||
|
} else if (jname != NULL) {
|
||||||
*name = jname;
|
*name = jname;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
@ -64,6 +102,19 @@ int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = iso_get_joliet_name(t->opts, t->input_charset, t->image->id,
|
||||||
|
iso->name, iso->type, &(t->joliet_ucs2_failures),
|
||||||
|
name, 0);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void joliet_node_free(JolietNode *node)
|
void joliet_node_free(JolietNode *node)
|
||||||
{
|
{
|
||||||
@ -120,7 +171,8 @@ int create_node(Ecma119Image *t, IsoNode *iso, JolietNode **node)
|
|||||||
IsoFile *file = (IsoFile*) iso;
|
IsoFile *file = (IsoFile*) iso;
|
||||||
|
|
||||||
size = iso_stream_get_size(file->stream);
|
size = iso_stream_get_size(file->stream);
|
||||||
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->iso_level != 3) {
|
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE &&
|
||||||
|
t->opts->iso_level != 3) {
|
||||||
char *ipath = iso_tree_get_node_path(iso);
|
char *ipath = iso_tree_get_node_path(iso);
|
||||||
free(joliet);
|
free(joliet);
|
||||||
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
|
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
|
||||||
@ -188,7 +240,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, JolietNode **tree, int pathlen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
max_path = pathlen + 1 + (jname ? ucslen(jname) * 2 : 0);
|
max_path = pathlen + 1 + (jname ? ucslen(jname) * 2 : 0);
|
||||||
if (!t->joliet_longer_paths && max_path > 240) {
|
if (!t->opts->joliet_longer_paths && max_path > 240) {
|
||||||
char *ipath = iso_tree_get_node_path(iso);
|
char *ipath = iso_tree_get_node_path(iso);
|
||||||
/*
|
/*
|
||||||
* Wow!! Joliet is even more restrictive than plain ISO-9660,
|
* Wow!! Joliet is even more restrictive than plain ISO-9660,
|
||||||
@ -249,7 +301,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, JolietNode **tree, int pathlen)
|
|||||||
{
|
{
|
||||||
char *ipath = iso_tree_get_node_path(iso);
|
char *ipath = iso_tree_get_node_path(iso);
|
||||||
ret = iso_msg_submit(t->image->id, ISO_FILE_IGNORED, 0,
|
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 "
|
"Cannot add %s to Joliet tree. %s can only be added to a "
|
||||||
"Rock Ridge tree.", ipath, (iso->type == LIBISO_SYMLINK ?
|
"Rock Ridge tree.", ipath, (iso->type == LIBISO_SYMLINK ?
|
||||||
"Symlinks" : "Special files"));
|
"Symlinks" : "Special files"));
|
||||||
free(ipath);
|
free(ipath);
|
||||||
@ -349,7 +401,7 @@ int mangle_single_dir(Ecma119Image *t, JolietNode *dir)
|
|||||||
int ret;
|
int ret;
|
||||||
int i, nchildren, maxchar = 64;
|
int i, nchildren, maxchar = 64;
|
||||||
JolietNode **children;
|
JolietNode **children;
|
||||||
IsoHTable *table;
|
IsoHTable *table = NULL;
|
||||||
int need_sort = 0;
|
int need_sort = 0;
|
||||||
uint16_t *full_name = NULL;
|
uint16_t *full_name = NULL;
|
||||||
uint16_t *tmp = NULL;
|
uint16_t *tmp = NULL;
|
||||||
@ -359,7 +411,7 @@ int mangle_single_dir(Ecma119Image *t, JolietNode *dir)
|
|||||||
nchildren = dir->info.dir->nchildren;
|
nchildren = dir->info.dir->nchildren;
|
||||||
children = dir->info.dir->children;
|
children = dir->info.dir->children;
|
||||||
|
|
||||||
if (t->joliet_long_names)
|
if (t->opts->joliet_long_names)
|
||||||
maxchar = 103;
|
maxchar = 103;
|
||||||
|
|
||||||
/* a hash table will temporary hold the names, for fast searching */
|
/* a hash table will temporary hold the names, for fast searching */
|
||||||
@ -598,7 +650,7 @@ size_t calc_dirent_len(Ecma119Image *t, JolietNode *n)
|
|||||||
{
|
{
|
||||||
/* note than name len is always even, so we always need the pad byte */
|
/* note than name len is always even, so we always need the pad byte */
|
||||||
int ret = n->name ? ucslen(n->name) * 2 + 34 : 34;
|
int ret = n->name ? ucslen(n->name) * 2 + 34 : 34;
|
||||||
if (n->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
if (n->type == JOLIET_FILE && !(t->opts->omit_version_numbers & 3)) {
|
||||||
/* take into account version numbers */
|
/* take into account version numbers */
|
||||||
ret += 4;
|
ret += 4;
|
||||||
}
|
}
|
||||||
@ -717,7 +769,7 @@ int joliet_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
|
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
|
||||||
t->joliet_path_table_size = path_table_size;
|
t->joliet_path_table_size = path_table_size;
|
||||||
|
|
||||||
if (t->partition_offset > 0) {
|
if (t->opts->partition_offset > 0) {
|
||||||
/* Take into respect second directory tree */
|
/* Take into respect second directory tree */
|
||||||
ndirs = t->joliet_ndirs;
|
ndirs = t->joliet_ndirs;
|
||||||
t->joliet_ndirs = 0;
|
t->joliet_ndirs = 0;
|
||||||
@ -766,7 +818,7 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
|
|||||||
|
|
||||||
memcpy(rec->file_id, name, len_fi);
|
memcpy(rec->file_id, name, len_fi);
|
||||||
|
|
||||||
if (node->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
if (node->type == JOLIET_FILE && !(t->opts->omit_version_numbers & 3)) {
|
||||||
len_dr += 4;
|
len_dr += 4;
|
||||||
rec->file_id[len_fi++] = 0;
|
rec->file_id[len_fi++] = 0;
|
||||||
rec->file_id[len_fi++] = ';';
|
rec->file_id[len_fi++] = ';';
|
||||||
@ -801,13 +853,13 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
|
|||||||
iso_bb(rec->block, block - t->eff_partition_offset, 4);
|
iso_bb(rec->block, block - t->eff_partition_offset, 4);
|
||||||
iso_bb(rec->length, len, 4);
|
iso_bb(rec->length, len, 4);
|
||||||
|
|
||||||
/* was: iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
/* was: iso_datetime_7(rec->recording_time, t->now, t->opts->always_gmt);
|
||||||
*/
|
*/
|
||||||
iso= node->node;
|
iso= node->node;
|
||||||
iso_datetime_7(rec->recording_time,
|
iso_datetime_7(rec->recording_time,
|
||||||
(t->dir_rec_mtime & 2) ? ( t->replace_timestamps ?
|
(t->opts->dir_rec_mtime & 2) ? ( t->replace_timestamps ?
|
||||||
t->timestamp : iso->mtime )
|
t->timestamp : iso->mtime )
|
||||||
: t->now, t->always_gmt);
|
: t->now, t->opts->always_gmt);
|
||||||
|
|
||||||
rec->flags[0] = ((node->type == JOLIET_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
rec->flags[0] = ((node->type == JOLIET_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
||||||
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
|
||||||
@ -828,18 +880,22 @@ void ucsncpy_pad(uint16_t *dest, const uint16_t *src, size_t max)
|
|||||||
csrc = (char*)src;
|
csrc = (char*)src;
|
||||||
|
|
||||||
if (src != NULL) {
|
if (src != NULL) {
|
||||||
len = MIN(ucslen(src) * 2, max);
|
len = MIN(ucslen(src) * 2, max - (max % 2));
|
||||||
} else {
|
} else {
|
||||||
len = 0;
|
len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < len; ++i)
|
for (i = 0; i < len; ++i)
|
||||||
cdest[i] = csrc[i];
|
cdest[i] = csrc[i];
|
||||||
|
if (len >= 2)
|
||||||
|
iso_handle_split_utf16(dest + (len / 2 - 1));
|
||||||
|
|
||||||
for (i = len; i < max; i += 2) {
|
for (i = len; i + 1 < max; i += 2) {
|
||||||
cdest[i] = '\0';
|
cdest[i] = '\0';
|
||||||
cdest[i + 1] = ' ';
|
cdest[i + 1] = ' ';
|
||||||
}
|
}
|
||||||
|
if (max % 2)
|
||||||
|
cdest[max - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int joliet_writer_write_vol_desc(IsoImageWriter *writer)
|
int joliet_writer_write_vol_desc(IsoImageWriter *writer)
|
||||||
@ -958,7 +1014,8 @@ int write_one_dir(Ecma119Image *t, JolietNode *dir)
|
|||||||
/* compute len of directory entry */
|
/* compute len of directory entry */
|
||||||
fi_len = ucslen(child->name) * 2;
|
fi_len = ucslen(child->name) * 2;
|
||||||
len = fi_len + 34;
|
len = fi_len + 34;
|
||||||
if (child->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
if (child->type == JOLIET_FILE &&
|
||||||
|
!(t->opts->omit_version_numbers & 3)) {
|
||||||
len += 4;
|
len += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1160,8 +1217,8 @@ int joliet_writer_write_data(IsoImageWriter *writer)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (t->partition_offset > 0) {
|
if (t->opts->partition_offset > 0) {
|
||||||
t->eff_partition_offset = t->partition_offset;
|
t->eff_partition_offset = t->opts->partition_offset;
|
||||||
ret = joliet_writer_write_dirs(writer);
|
ret = joliet_writer_write_dirs(writer);
|
||||||
t->eff_partition_offset = 0;
|
t->eff_partition_offset = 0;
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -1209,9 +1266,9 @@ int joliet_writer_create(Ecma119Image *target)
|
|||||||
/* add this writer to image */
|
/* add this writer to image */
|
||||||
target->writers[target->nwriters++] = writer;
|
target->writers[target->nwriters++] = writer;
|
||||||
|
|
||||||
if(target->partition_offset > 0) {
|
if(target->opts->partition_offset > 0) {
|
||||||
/* Create second tree */
|
/* Create second tree */
|
||||||
target->eff_partition_offset = target->partition_offset;
|
target->eff_partition_offset = target->opts->partition_offset;
|
||||||
ret = joliet_tree_create(target);
|
ret = joliet_tree_create(target);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -63,5 +63,13 @@ int joliet_writer_create(Ecma119Image *target);
|
|||||||
*/
|
*/
|
||||||
int joliet_writer_write_vol_desc(IsoImageWriter *writer);
|
int joliet_writer_write_vol_desc(IsoImageWriter *writer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the Joliet name from node name.
|
||||||
|
* @param flag bit0= Do not issue error messages
|
||||||
|
*/
|
||||||
|
int iso_get_joliet_name(IsoWriteOpts *opts, char *input_charset, int imgid,
|
||||||
|
char *node_name, enum IsoNodeType node_type,
|
||||||
|
size_t *joliet_ucs2_failures,
|
||||||
|
uint16_t **name, int flag);
|
||||||
|
|
||||||
#endif /* LIBISO_JOLIET_H */
|
#endif /* LIBISO_JOLIET_H */
|
||||||
|
@ -288,7 +288,7 @@ int libiso_msgs__sev_to_text(int severity, char **severity_name,
|
|||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
if(flag&1) {
|
if(flag&1) {
|
||||||
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nMISHAP\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nERRFILE\nALL";
|
*severity_name= "ALL ERRFILE DEBUG UPDATE NOTE HINT WARNING SORRY MISHAP FAILURE FATAL ABORT NEVER";
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
*severity_name= "";
|
*severity_name= "";
|
||||||
|
@ -316,7 +316,7 @@ int libiso_msgs_submit(struct libiso_msgs *m, int origin, int error_code,
|
|||||||
|
|
||||||
/** Convert a registered severity number into a severity name
|
/** Convert a registered severity number into a severity name
|
||||||
@param flag Bitfield for control purposes:
|
@param flag Bitfield for control purposes:
|
||||||
bit0= list all severity names in a newline separated string
|
bit0= list all severity names in a blank separated string
|
||||||
@return >0 success, <=0 failure
|
@return >0 success, <=0 failure
|
||||||
*/
|
*/
|
||||||
int libiso_msgs__sev_to_text(int severity, char **severity_name,
|
int libiso_msgs__sev_to_text(int severity, char **severity_name,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007-2008 Vreixo Formoso, Mario Danic
|
* Copyright (c) 2007-2008 Vreixo Formoso, Mario Danic
|
||||||
* Copyright (c) 2009-2012 Thomas Schmitt
|
* Copyright (c) 2009-2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -83,8 +83,8 @@
|
|||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
*/
|
*/
|
||||||
#define iso_lib_header_version_major 1
|
#define iso_lib_header_version_major 1
|
||||||
#define iso_lib_header_version_minor 2
|
#define iso_lib_header_version_minor 3
|
||||||
#define iso_lib_header_version_micro 4
|
#define iso_lib_header_version_micro 6
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get version of the libisofs library at runtime.
|
* Get version of the libisofs library at runtime.
|
||||||
@ -328,7 +328,7 @@ enum eltorito_boot_media_type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace mode used when addding a node to a file.
|
* Replace mode used when addding a node to a directory.
|
||||||
* This controls how libisofs will act when you tried to add to a dir a file
|
* This controls how libisofs will act when you tried to add to a dir a file
|
||||||
* with the same name that an existing file.
|
* with the same name that an existing file.
|
||||||
*
|
*
|
||||||
@ -1771,6 +1771,16 @@ int iso_write_opts_set_joliet_longer_paths(IsoWriteOpts *opts, int allow);
|
|||||||
*/
|
*/
|
||||||
int iso_write_opts_set_joliet_long_names(IsoWriteOpts *opts, int allow);
|
int iso_write_opts_set_joliet_long_names(IsoWriteOpts *opts, int allow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use character set UTF-16BE with Joliet, which is a superset of the
|
||||||
|
* actually prescribed character set UCS-2.
|
||||||
|
* This breaks Joliet specification with exotic characters which would
|
||||||
|
* elsewise be mapped to underscore '_'. Use with caution.
|
||||||
|
*
|
||||||
|
* @since 1.3.6
|
||||||
|
*/
|
||||||
|
int iso_write_opts_set_joliet_utf16(IsoWriteOpts *opts, int allow);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write Rock Ridge info as of specification RRIP-1.10 rather than RRIP-1.12:
|
* Write Rock Ridge info as of specification RRIP-1.10 rather than RRIP-1.12:
|
||||||
* signature "RRIP_1991A" rather than "IEEE_1282", field PX without file
|
* signature "RRIP_1991A" rather than "IEEE_1282", field PX without file
|
||||||
@ -2126,6 +2136,15 @@ int iso_write_opts_set_overwrite_buf(IsoWriteOpts *opts, uint8_t *overwrite);
|
|||||||
*/
|
*/
|
||||||
int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Release 1.3.6 contains an incomplete implementation of preparations for the
|
||||||
|
* HP-PA bootloader PALO. Its header version 5 is not completely defined yet.
|
||||||
|
* To enable the code for these preparations, you have to define the macro
|
||||||
|
* Libisofs_enable_unreleased_hppa_palO
|
||||||
|
* and to insert into libisofs/libisofs.ver the lines
|
||||||
|
* iso_image_set_hppa_palo;
|
||||||
|
* iso_image_get_hppa_palo;
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* Attach 32 kB of binary data which shall get written to the first 32 kB
|
* Attach 32 kB of binary data which shall get written to the first 32 kB
|
||||||
* of the ISO image, the ECMA-119 System Area. This space is intended for
|
* of the ISO image, the ECMA-119 System Area. This space is intended for
|
||||||
@ -2156,23 +2175,38 @@ int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
|||||||
* bit2-7= System area type
|
* bit2-7= System area type
|
||||||
* 0= with bit0 or bit1: MBR
|
* 0= with bit0 or bit1: MBR
|
||||||
* else: unspecified type which will be used unaltered.
|
* else: unspecified type which will be used unaltered.
|
||||||
* @since 0.6.38
|
|
||||||
* 1= MIPS Big Endian Volume Header
|
* 1= MIPS Big Endian Volume Header
|
||||||
|
* @since 0.6.38
|
||||||
* Submit up to 15 MIPS Big Endian boot files by
|
* Submit up to 15 MIPS Big Endian boot files by
|
||||||
* iso_image_add_mips_boot_file().
|
* iso_image_add_mips_boot_file().
|
||||||
* This will overwrite the first 512 bytes of the submitted
|
* This will overwrite the first 512 bytes of the submitted
|
||||||
* data.
|
* data.
|
||||||
* 2= DEC Boot Block for MIPS Little Endian
|
* 2= DEC Boot Block for MIPS Little Endian
|
||||||
|
* @since 0.6.38
|
||||||
* The first boot file submitted by
|
* The first boot file submitted by
|
||||||
* iso_image_add_mips_boot_file() will be activated.
|
* iso_image_add_mips_boot_file() will be activated.
|
||||||
* This will overwrite the first 512 bytes of the submitted
|
* This will overwrite the first 512 bytes of the submitted
|
||||||
* data.
|
* data.
|
||||||
* @since 0.6.40
|
|
||||||
* 3= SUN Disk Label for SUN SPARC
|
* 3= SUN Disk Label for SUN SPARC
|
||||||
|
* @since 0.6.40
|
||||||
* Submit up to 7 SPARC boot images by
|
* Submit up to 7 SPARC boot images by
|
||||||
* iso_write_opts_set_partition_img() for partition numbers 2
|
* iso_write_opts_set_partition_img() for partition numbers 2
|
||||||
* to 8.
|
* to 8.
|
||||||
* This will overwrite the first 512 bytes of the submitted
|
* This will overwrite the first 512 bytes of the submitted
|
||||||
|
* data.
|
||||||
|
* 4= HP-PA PALO boot sector version 4 for HP PA-RISC
|
||||||
|
* <<< only ifdef Libisofs_enable_unreleased_hppa_palO
|
||||||
|
* @since 1.3.8
|
||||||
|
* Suitable for older PALO of e.g. Debian 4 and 5.
|
||||||
|
* Submit all five parameters of iso_image_set_hppa_palo():
|
||||||
|
* cmdline, bootloader, kernel_32, kernel_64, ramdisk
|
||||||
|
* 5= HP-PA PALO boot sector version 5 for HP PA-RISC
|
||||||
|
* <<< only ifdef Libisofs_enable_unreleased_hppa_palO
|
||||||
|
* @since 1.3.8
|
||||||
|
* Suitable for newer PALO, where PALOHDRVERSION in
|
||||||
|
* lib/common.h is defined as 5.
|
||||||
|
* Submit all five parameters of iso_image_set_hppa_palo():
|
||||||
|
* cmdline, bootloader, kernel_32, kernel_64, ramdisk
|
||||||
* bit8-9= Only with System area type 0 = MBR
|
* bit8-9= Only with System area type 0 = MBR
|
||||||
* @since 1.0.4
|
* @since 1.0.4
|
||||||
* Cylinder alignment mode eventually pads the image to make it
|
* Cylinder alignment mode eventually pads the image to make it
|
||||||
@ -2180,6 +2214,9 @@ int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
|||||||
* 0 = auto (align if bit1)
|
* 0 = auto (align if bit1)
|
||||||
* 1 = always align to cylinder boundary
|
* 1 = always align to cylinder boundary
|
||||||
* 2 = never align to cylinder boundary
|
* 2 = never align to cylinder boundary
|
||||||
|
* 3 = always align, additionally pad up and align partitions
|
||||||
|
* which were appended by iso_write_opts_set_partition_img()
|
||||||
|
* @since 1.2.6
|
||||||
* bit10-13= System area sub type
|
* bit10-13= System area sub type
|
||||||
* @since 1.2.4
|
* @since 1.2.4
|
||||||
* With type 0 = MBR:
|
* With type 0 = MBR:
|
||||||
@ -2188,6 +2225,13 @@ int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
|||||||
* 1 = CHRP: A single MBR partition of type 0x96 covers the
|
* 1 = CHRP: A single MBR partition of type 0x96 covers the
|
||||||
* ISO image. Not compatible with any other feature
|
* ISO image. Not compatible with any other feature
|
||||||
* which needs to have own MBR partition entries.
|
* which needs to have own MBR partition entries.
|
||||||
|
* bit14= Only with System area type 0 = MBR
|
||||||
|
* GRUB2 boot provisions:
|
||||||
|
* @since 1.3.0
|
||||||
|
* Patch system area at byte 92 to 99 with 512-block address + 1
|
||||||
|
* of the first boot image file. Little-endian 8-byte.
|
||||||
|
* Should be combined with options bit0.
|
||||||
|
* Will not be in effect if options bit1 is set.
|
||||||
* @param flag
|
* @param flag
|
||||||
* bit0 = invalidate any attached system area data. Same as data == NULL
|
* bit0 = invalidate any attached system area data. Same as data == NULL
|
||||||
* (This re-activates eventually loaded image System Area data.
|
* (This re-activates eventually loaded image System Area data.
|
||||||
@ -2245,7 +2289,8 @@ int iso_write_opts_set_disc_label(IsoWriteOpts *opts, char *label);
|
|||||||
* as timezone.
|
* as timezone.
|
||||||
* Other than with vol_*_time the resulting string in the ISO image
|
* Other than with vol_*_time the resulting string in the ISO image
|
||||||
* is fully predictable and free of timezone pitfalls.
|
* is fully predictable and free of timezone pitfalls.
|
||||||
* It should express a reasonable time in form YYYYMMDDhhmmsscc
|
* It should express a reasonable time in form YYYYMMDDhhmmsscc.
|
||||||
|
* The timezone will always be recorded as GMT.
|
||||||
* E.g.: "2010040711405800" = 7 Apr 2010 11:40:58 (+0 centiseconds)
|
* E.g.: "2010040711405800" = 7 Apr 2010 11:40:58 (+0 centiseconds)
|
||||||
* @return
|
* @return
|
||||||
* ISO_SUCCESS or error
|
* ISO_SUCCESS or error
|
||||||
@ -2883,7 +2928,7 @@ void iso_image_set_volset_id(IsoImage *image, const char *volset_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the volset identifier.
|
* Get the volset identifier.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2899,7 +2944,7 @@ void iso_image_set_volume_id(IsoImage *image, const char *volume_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the volume identifier.
|
* Get the volume identifier.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2915,7 +2960,7 @@ void iso_image_set_publisher_id(IsoImage *image, const char *publisher_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the publisher of a image.
|
* Get the publisher of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2932,7 +2977,7 @@ void iso_image_set_data_preparer_id(IsoImage *image,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the data preparer of a image.
|
* Get the data preparer of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2948,7 +2993,7 @@ void iso_image_set_system_id(IsoImage *image, const char *system_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the system id of a image.
|
* Get the system id of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2964,7 +3009,7 @@ void iso_image_set_application_id(IsoImage *image, const char *application_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the application id of a image.
|
* Get the application id of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -2982,7 +3027,7 @@ void iso_image_set_copyright_file_id(IsoImage *image,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the copyright information of a image.
|
* Get the copyright information of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -3000,7 +3045,7 @@ void iso_image_set_abstract_file_id(IsoImage *image,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the abstract information of a image.
|
* Get the abstract information of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed nor
|
||||||
* changed.
|
* changed.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -3017,13 +3062,73 @@ void iso_image_set_biblio_file_id(IsoImage *image, const char *biblio_file_id);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the biblio information of a image.
|
* Get the biblio information of a image.
|
||||||
* The returned string is owned by the image and should not be freed nor
|
* The returned string is owned by the image and must not be freed or changed.
|
||||||
* changed.
|
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
*/
|
*/
|
||||||
const char *iso_image_get_biblio_file_id(const IsoImage *image);
|
const char *iso_image_get_biblio_file_id(const IsoImage *image);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fill Application Use field of the Primary Volume Descriptor.
|
||||||
|
* ECMA-119 8.4.32 Application Use (BP 884 to 1395)
|
||||||
|
* "This field shall be reserved for application use. Its content
|
||||||
|
* is not specified by this Standard."
|
||||||
|
*
|
||||||
|
* @param image
|
||||||
|
* The image to manipulate.
|
||||||
|
* @param app_use_data
|
||||||
|
* Up to 512 bytes of data.
|
||||||
|
* @param count
|
||||||
|
* The number of bytes in app_use_data. If the number is smaller than 512,
|
||||||
|
* then the remaining bytes will be set to 0.
|
||||||
|
* @since 1.3.2
|
||||||
|
*/
|
||||||
|
void iso_image_set_app_use(IsoImage *image, const char *app_use_data,
|
||||||
|
int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current setting for the Application Use field of the Primary Volume
|
||||||
|
* Descriptor.
|
||||||
|
* The returned char array of 512 bytes is owned by the image and must not
|
||||||
|
* be freed or changed.
|
||||||
|
*
|
||||||
|
* @param image
|
||||||
|
* The image to inquire
|
||||||
|
* @since 1.3.2
|
||||||
|
*/
|
||||||
|
const char *iso_image_get_app_use(IsoImage *image);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the four timestamps from the Primary Volume Descriptor of the imported
|
||||||
|
* ISO image. The timestamps are strings which are either empty or consist
|
||||||
|
* of 16 digits of the form YYYYMMDDhhmmsscc, plus a signed byte in the range
|
||||||
|
* of -48 to +52, which gives the timezone offset in steps of 15 minutes.
|
||||||
|
* None of the returned string pointers shall be used for altering or freeing
|
||||||
|
* data. They are just for reading.
|
||||||
|
*
|
||||||
|
* @param image
|
||||||
|
* The image to be inquired.
|
||||||
|
* @param vol_creation_time
|
||||||
|
* Returns a pointer to the Volume Creation time:
|
||||||
|
* When "the information in the volume was created."
|
||||||
|
* @param vol_modification_time
|
||||||
|
* Returns a pointer to Volume Modification time:
|
||||||
|
* When "the information in the volume was last modified."
|
||||||
|
* @param vol_expiration_time
|
||||||
|
* Returns a pointer to Volume Expiration time:
|
||||||
|
* When "the information in the volume may be regarded as obsolete."
|
||||||
|
* @param vol_effective_time
|
||||||
|
* Returns a pointer to Volume Expiration time:
|
||||||
|
* When "the information in the volume may be used."
|
||||||
|
* @return
|
||||||
|
* ISO_SUCCESS or error
|
||||||
|
*
|
||||||
|
* @since 1.2.8
|
||||||
|
*/
|
||||||
|
int iso_image_get_pvd_times(IsoImage *image,
|
||||||
|
char **creation_time, char **modification_time,
|
||||||
|
char **expiration_time, char **effective_time);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new set of El-Torito bootable images by adding a boot catalog
|
* Create a new set of El-Torito bootable images by adding a boot catalog
|
||||||
* and the default boot image.
|
* and the default boot image.
|
||||||
@ -3052,7 +3157,7 @@ const char *iso_image_get_biblio_file_id(const IsoImage *image);
|
|||||||
* creation time.
|
* creation time.
|
||||||
* @param boot
|
* @param boot
|
||||||
* Location where a pointer to the added boot image will be stored. That
|
* Location where a pointer to the added boot image will be stored. That
|
||||||
* object is owned by the IsoImage and should not be freed by the user,
|
* object is owned by the IsoImage and must not be freed by the user,
|
||||||
* nor dereferenced once the last reference to the IsoImage was disposed
|
* nor dereferenced once the last reference to the IsoImage was disposed
|
||||||
* via iso_image_unref(). A NULL value is allowed if you don't need a
|
* via iso_image_unref(). A NULL value is allowed if you don't need a
|
||||||
* reference to the boot image.
|
* reference to the boot image.
|
||||||
@ -3102,7 +3207,7 @@ int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
|||||||
* the image and catalog tree nodes. An application would want those, for
|
* the image and catalog tree nodes. An application would want those, for
|
||||||
* example, to prevent the user removing it.
|
* example, to prevent the user removing it.
|
||||||
*
|
*
|
||||||
* Both nodes are owned by libisofs and should not be freed. You can get your
|
* Both nodes are owned by libisofs and must not be freed. You can get your
|
||||||
* own ref with iso_node_ref(). You can also check if the node is already
|
* own ref with iso_node_ref(). You can also check if the node is already
|
||||||
* on the tree by getting its parent (note that when reading El-Torito info
|
* on the tree by getting its parent (note that when reading El-Torito info
|
||||||
* from a previous image, the nodes might not be on the tree even if you haven't
|
* from a previous image, the nodes might not be on the tree even if you haven't
|
||||||
@ -3114,7 +3219,7 @@ int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
|||||||
* The image from which to get the boot image.
|
* The image from which to get the boot image.
|
||||||
* @param boot
|
* @param boot
|
||||||
* If not NULL, it will be filled with a pointer to the boot image, if
|
* If not NULL, it will be filled with a pointer to the boot image, if
|
||||||
* any. That object is owned by the IsoImage and should not be freed by
|
* any. That object is owned by the IsoImage and must not be freed by
|
||||||
* the user, nor dereferenced once the last reference to the IsoImage was
|
* the user, nor dereferenced once the last reference to the IsoImage was
|
||||||
* disposed via iso_image_unref().
|
* disposed via iso_image_unref().
|
||||||
* @param imgnode
|
* @param imgnode
|
||||||
@ -3432,9 +3537,15 @@ int el_torito_get_selection_crit(ElToritoBootImage *bootimg, uint8_t crit[20]);
|
|||||||
* @param bootimg
|
* @param bootimg
|
||||||
* The image to inquire
|
* The image to inquire
|
||||||
* @param flag
|
* @param flag
|
||||||
* Reserved for future usage, set to 0.
|
* Bitfield for control purposes:
|
||||||
|
* bit0 - bit3= mode
|
||||||
|
* 0 = inquire for classic boot info table as described in man mkisofs
|
||||||
|
* @since 0.6.32
|
||||||
|
* 1 = inquire for GRUB2 boot info as of bit9 of options of
|
||||||
|
* el_torito_set_isolinux_options()
|
||||||
|
* @since 1.3.0
|
||||||
* @return
|
* @return
|
||||||
* 1 = seems to contain oot info table , 0 = quite surely not
|
* 1 = seems to contain the inquired boot info, 0 = quite surely not
|
||||||
* @since 0.6.32
|
* @since 0.6.32
|
||||||
*/
|
*/
|
||||||
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag);
|
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag);
|
||||||
@ -3485,13 +3596,24 @@ int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag);
|
|||||||
* iso_write_opts_set_hfsplus().
|
* iso_write_opts_set_hfsplus().
|
||||||
* @since 1.2.4
|
* @since 1.2.4
|
||||||
* Primary GPT and backup GPT get written if at least one
|
* Primary GPT and backup GPT get written if at least one
|
||||||
* ElToritoBootImage shall be mentioned
|
* ElToritoBootImage shall be mentioned.
|
||||||
|
* The first three mentioned GPT partitions get mirrored in the
|
||||||
|
* the partition table of the isohybrid MBR. They get type 0xfe.
|
||||||
|
* The MBR partition entry for PC-BIOS gets type 0x00 rather
|
||||||
|
* than 0x17.
|
||||||
|
* Often it is one of the further MBR partitions which actually
|
||||||
|
* gets used by EFI.
|
||||||
* @since 1.2.4
|
* @since 1.2.4
|
||||||
* bit8= Mention in isohybrid Apple partition map
|
* bit8= Mention in isohybrid Apple partition map
|
||||||
* APM get written if at least one ElToritoBootImage shall be
|
* APM get written if at least one ElToritoBootImage shall be
|
||||||
* mentioned. The ISOLINUX MBR must look suitable or else an error
|
* mentioned. The ISOLINUX MBR must look suitable or else an error
|
||||||
* event will happen at image generation time.
|
* event will happen at image generation time.
|
||||||
* @since 1.2.4
|
* @since 1.2.4
|
||||||
|
* bit9= GRUB2 boot info
|
||||||
|
* Patch the boot image file at byte 1012 with the 512-block
|
||||||
|
* address + 2. Two little endian 32-bit words. Low word first.
|
||||||
|
* This is combinable with bit0.
|
||||||
|
* @since 1.3.0
|
||||||
* @param flag
|
* @param flag
|
||||||
* Reserved for future usage, set to 0.
|
* Reserved for future usage, set to 0.
|
||||||
* @return
|
* @return
|
||||||
@ -3535,7 +3657,7 @@ void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg);
|
|||||||
* @param img
|
* @param img
|
||||||
* The image to be inquired.
|
* The image to be inquired.
|
||||||
* @param data
|
* @param data
|
||||||
* A byte array of at least 32768 bytesi to take the loaded bytes.
|
* A byte array of at least 32768 bytes to take the loaded bytes.
|
||||||
* @param options
|
* @param options
|
||||||
* The option bits which will be applied if not overridden by
|
* The option bits which will be applied if not overridden by
|
||||||
* iso_write_opts_set_system_area(). See there.
|
* iso_write_opts_set_system_area(). See there.
|
||||||
@ -3599,6 +3721,105 @@ int iso_image_get_mips_boot_files(IsoImage *image, char *paths[15], int flag);
|
|||||||
*/
|
*/
|
||||||
int iso_image_give_up_mips_boot(IsoImage *image, int flag);
|
int iso_image_give_up_mips_boot(IsoImage *image, int flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Designate a data file in the ISO image of which the position and size
|
||||||
|
* shall be written after the SUN Disk Label. The position is written as
|
||||||
|
* 64-bit big-endian number to byte position 0x228. The size is written
|
||||||
|
* as 32-bit big-endian to 0x230.
|
||||||
|
* This setting has an effect only if system area type is set to 3
|
||||||
|
* with iso_write_opts_set_system_area().
|
||||||
|
*
|
||||||
|
* @param img
|
||||||
|
* The image to be manipulated.
|
||||||
|
* @param sparc_core
|
||||||
|
* The IsoFile which shall be mentioned after the SUN Disk label.
|
||||||
|
* NULL is a permissible value. It disables this feature.
|
||||||
|
* @param flag
|
||||||
|
* Bitfield for control purposes, unused yet, submit 0
|
||||||
|
* @return
|
||||||
|
* 1 is success , <0 means error
|
||||||
|
* @since 1.3.0
|
||||||
|
*/
|
||||||
|
int iso_image_set_sparc_core(IsoImage *img, IsoFile *sparc_core, int flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain the current setting of iso_image_set_sparc_core().
|
||||||
|
*
|
||||||
|
* @param img
|
||||||
|
* The image to be inquired.
|
||||||
|
* @param sparc_core
|
||||||
|
* Will return a pointer to the IsoFile (or NULL, which is not an error)
|
||||||
|
* @param flag
|
||||||
|
* Bitfield for control purposes, unused yet, submit 0
|
||||||
|
* @return
|
||||||
|
* 1 is success , <0 means error
|
||||||
|
* @since 1.3.0
|
||||||
|
*/
|
||||||
|
int iso_image_get_sparc_core(IsoImage *img, IsoFile **sparc_core, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Libisofs_enable_unreleased_hppa_palO
|
||||||
|
|
||||||
|
/* <<< This API call and the implementation of its consequences are not yet
|
||||||
|
stable. So it gets excluded from releases.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a command line and submit the paths of four mandatory files for
|
||||||
|
* production of a HP-PA PALO boot sector for PA-RISC machines.
|
||||||
|
* The paths must lead to already existing data files in the ISO image
|
||||||
|
* which stay with these paths until image production.
|
||||||
|
*
|
||||||
|
* @param img
|
||||||
|
* The image to be manipulated.
|
||||||
|
* @param cmdline
|
||||||
|
* Up to 127 characters of command line.
|
||||||
|
* @param bootloader
|
||||||
|
* Absolute path of a data file in the ISO image.
|
||||||
|
* @param kernel_32
|
||||||
|
* Absolute path of a data file in the ISO image which serves as
|
||||||
|
* 32 bit kernel.
|
||||||
|
* @param kernel_64
|
||||||
|
* Absolute path of a data file in the ISO image which serves as
|
||||||
|
* 64 bit kernel.
|
||||||
|
* @param ramdisk
|
||||||
|
* Absolute path of a data file in the ISO image.
|
||||||
|
* @param flag
|
||||||
|
* Bitfield for control purposes
|
||||||
|
* bit0= Let NULL parameters free the corresponding image properties.
|
||||||
|
* Else only the non-NULL parameters of this call have an effect
|
||||||
|
* @return
|
||||||
|
* 1 is success , <0 means error
|
||||||
|
* @since 1.3.8
|
||||||
|
*/
|
||||||
|
int iso_image_set_hppa_palo(IsoImage *img, char *cmdline, char *bootloader,
|
||||||
|
char *kernel_32, char *kernel_64, char *ramdisk,
|
||||||
|
int flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inquire the current settings of iso_image_set_hppa_palo().
|
||||||
|
* Do not free() the returned pointers.
|
||||||
|
*
|
||||||
|
* @param img
|
||||||
|
* The image to be inquired.
|
||||||
|
* @param cmdline
|
||||||
|
* Will return the command line.
|
||||||
|
* @param bootloader
|
||||||
|
* Will return the absolute path of the bootloader file.
|
||||||
|
* @param kernel_32
|
||||||
|
* Will return the absolute path of the 32 bit kernel file.
|
||||||
|
* @param kernel_64
|
||||||
|
* Will return the absolute path of the 64 bit kernel file.
|
||||||
|
* @param ramdisk
|
||||||
|
* Will return the absolute path of the RAM disk file.
|
||||||
|
* @return
|
||||||
|
* 1 is success , <0 means error
|
||||||
|
* @since 1.3.8
|
||||||
|
*/
|
||||||
|
int iso_image_get_hppa_palo(IsoImage *img, char **cmdline, char **bootloader,
|
||||||
|
char **kernel_32, char **kernel_64, char **ramdisk);
|
||||||
|
|
||||||
|
#endif /* Libisofs_enable_unreleased_hppa_palO */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the reference counting of the given node.
|
* Increments the reference counting of the given node.
|
||||||
@ -3830,7 +4051,7 @@ int iso_node_set_name(IsoNode *node, const char *name);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of a node.
|
* Get the name of a node.
|
||||||
* The returned string belongs to the node and should not be modified nor
|
* The returned string belongs to the node and must not be modified nor
|
||||||
* freed. Use strdup if you really need your own copy.
|
* freed. Use strdup if you really need your own copy.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -3983,7 +4204,7 @@ int iso_node_get_hidden(IsoNode *node);
|
|||||||
* @param n2
|
* @param n2
|
||||||
* The second node to compare.
|
* The second node to compare.
|
||||||
* @return
|
* @return
|
||||||
* -1 if s1 is smaller s2 , 0 if s1 matches s2 , 1 if s1 is larger s2
|
* -1 if n1 is smaller n2 , 0 if n1 matches n2 , 1 if n1 is larger n2
|
||||||
* @param flag
|
* @param flag
|
||||||
* Bitfield for control purposes, unused yet, submit 0
|
* Bitfield for control purposes, unused yet, submit 0
|
||||||
* @since 0.6.20
|
* @since 0.6.20
|
||||||
@ -4409,7 +4630,7 @@ int iso_dir_find_children(IsoDir* dir, IsoFindCondition *cond,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the destination of a node.
|
* Get the destination of a node.
|
||||||
* The returned string belongs to the node and should not be modified nor
|
* The returned string belongs to the node and must not be modified nor
|
||||||
* freed. Use strdup if you really need your own copy.
|
* freed. Use strdup if you really need your own copy.
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
@ -6327,7 +6548,10 @@ int iso_file_remove_filter(IsoFile *file, int flag);
|
|||||||
* @param stream
|
* @param stream
|
||||||
* The eventual filter stream to be inquired.
|
* The eventual filter stream to be inquired.
|
||||||
* @param flag
|
* @param flag
|
||||||
* Bitfield for control purposes. Submit 0 for now.
|
* Bitfield for control purposes.
|
||||||
|
* bit0= Follow the chain of input streams and return the one at the
|
||||||
|
* end of the chain.
|
||||||
|
* @since 1.3.2
|
||||||
* @return
|
* @return
|
||||||
* The input stream, if one exists. Elsewise NULL.
|
* The input stream, if one exists. Elsewise NULL.
|
||||||
* No extra reference to the stream is taken by this call.
|
* No extra reference to the stream is taken by this call.
|
||||||
@ -6973,6 +7197,54 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
|
|||||||
int *bless_max, int flag);
|
int *bless_max, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------- Character sets ---------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the characters in name from local charset to another charset or
|
||||||
|
* convert name to the representation of a particular ISO image name space.
|
||||||
|
* In the latter case it is assumed that the conversion result does not
|
||||||
|
* collide with any other converted name in the same directory.
|
||||||
|
* I.e. this function does not take into respect possible name changes
|
||||||
|
* due to collision handling.
|
||||||
|
*
|
||||||
|
* @param opts
|
||||||
|
* Defines output charset, UCS-2 versus UTF-16 for Joliet,
|
||||||
|
* and naming restrictions.
|
||||||
|
* @param name
|
||||||
|
* The input text which shall be converted.
|
||||||
|
* @param name_len
|
||||||
|
* The number of bytes in input text.
|
||||||
|
* @param result
|
||||||
|
* Will return the conversion result in case of success. Terminated by
|
||||||
|
* a trailing zero byte.
|
||||||
|
* Use free() to dispose it when no longer needed.
|
||||||
|
* @param result_len
|
||||||
|
* Will return the number of bytes in result (excluding trailing zero)
|
||||||
|
* @param flag
|
||||||
|
* Bitfield for control purposes.
|
||||||
|
* bit0-bit7= Name space
|
||||||
|
* 0= generic (to_charset is valid,
|
||||||
|
* no reserved characters, no length limits)
|
||||||
|
* 1= Rock Ridge (to_charset is valid)
|
||||||
|
* 2= Joliet (to_charset gets overridden by UCS-2 or UTF-16)
|
||||||
|
* 3= ECMA-119 (to_charset gets overridden by the
|
||||||
|
* dull ISO 9660 subset of ASCII)
|
||||||
|
* 4= HFS+ (to_charset gets overridden by UTF-16BE)
|
||||||
|
* bit8= Treat input text as directory name
|
||||||
|
* (matters for Joliet and ECMA-119)
|
||||||
|
* bit9= Do not issue error messages
|
||||||
|
* bit15= Reverse operation (best to be done only with results of
|
||||||
|
* previous conversions)
|
||||||
|
* @return
|
||||||
|
* 1 means success, <0 means error
|
||||||
|
*
|
||||||
|
* @since 1.3.6
|
||||||
|
*/
|
||||||
|
int iso_conv_name_chars(IsoWriteOpts *opts, char *name, size_t name_len,
|
||||||
|
char **result, size_t *result_len, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************ Error codes and return values for libisofs ********************/
|
/************ Error codes and return values for libisofs ********************/
|
||||||
|
|
||||||
/** successfully execution */
|
/** successfully execution */
|
||||||
@ -7415,11 +7687,32 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
|
|||||||
/** Too many chained symbolic links (FAILURE, HIGH, -395) */
|
/** Too many chained symbolic links (FAILURE, HIGH, -395) */
|
||||||
#define ISO_DEEP_SYMLINK 0xE830FE75
|
#define ISO_DEEP_SYMLINK 0xE830FE75
|
||||||
|
|
||||||
|
/** Unrecognized file type in ISO image (FAILURE, HIGH, -396) */
|
||||||
|
#define ISO_BAD_ISO_FILETYPE 0xE830FE74
|
||||||
|
|
||||||
|
/** Filename not suitable for character set UCS-2 (WARNING, HIGH, -397) */
|
||||||
|
#define ISO_NAME_NOT_UCS2 0xD030FE73
|
||||||
|
|
||||||
|
/** File name collision during ISO image import (WARNING, HIGH, -398) */
|
||||||
|
#define ISO_IMPORT_COLLISION 0xD030FE72
|
||||||
|
|
||||||
|
/** Incomplete HP-PA PALO boot parameters (FAILURE, HIGH, -399) */
|
||||||
|
#define ISO_HPPA_PALO_INCOMPL 0xE830FE71
|
||||||
|
|
||||||
|
/** HP-PA PALO boot address exceeds 2 GB (FAILURE, HIGH, -400) */
|
||||||
|
#define ISO_HPPA_PALO_OFLOW 0xE830FE70
|
||||||
|
|
||||||
|
/** HP-PA PALO file is not a data file (FAILURE, HIGH, -401) */
|
||||||
|
#define ISO_HPPA_PALO_NOTREG 0xE830FE6F
|
||||||
|
|
||||||
|
/** HP-PA PALO command line too long (FAILURE, HIGH, -402) */
|
||||||
|
#define ISO_HPPA_PALO_CMDLEN 0xE830FE6E
|
||||||
|
|
||||||
|
|
||||||
/* Internal developer note:
|
/* Internal developer note:
|
||||||
Place new error codes directly above this comment.
|
Place new error codes directly above this comment.
|
||||||
Newly introduced errors must get a message entry in
|
Newly introduced errors must get a message entry in
|
||||||
libisofs/message.c, function iso_error_to_msg()
|
libisofs/messages.c, function iso_error_to_msg()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ! PLACE NEW ERROR CODES ABOVE. NOT AFTER THIS LINE ! */
|
/* ! PLACE NEW ERROR CODES ABOVE. NOT AFTER THIS LINE ! */
|
||||||
@ -7464,42 +7757,12 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
|
|||||||
This allows to use arbitrary program code as provider of track input data.
|
This allows to use arbitrary program code as provider of track input data.
|
||||||
|
|
||||||
Objects compliant to this interface are either provided by the application
|
Objects compliant to this interface are either provided by the application
|
||||||
or by API calls of libburn: burn_fd_source_new() , burn_file_source_new(),
|
or by API calls of libburn: burn_fd_source_new(), burn_file_source_new(),
|
||||||
and burn_fifo_source_new().
|
and burn_fifo_source_new().
|
||||||
|
|
||||||
The API calls allow to use any file object as data source. Consider to feed
|
libisofs acts as "application" and implements an own class of burn_source.
|
||||||
an eventual custom data stream asynchronously into a pipe(2) and to let
|
Instances of that class are handed out by iso_image_create_burn_source().
|
||||||
libburn handle the rest.
|
|
||||||
In this case the following rule applies:
|
|
||||||
Call burn_source_free() exactly once for every source obtained from
|
|
||||||
libburn API. You MUST NOT otherwise use or manipulate its components.
|
|
||||||
|
|
||||||
In general, burn_source objects can be freed as soon as they are attached
|
|
||||||
to track objects. The track objects will keep them alive and dispose them
|
|
||||||
when they are no longer needed. With a fifo burn_source it makes sense to
|
|
||||||
keep the own reference for inquiring its state while burning is in
|
|
||||||
progress.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The following description of burn_source applies only to application
|
|
||||||
implemented burn_source objects. You need not to know it for API provided
|
|
||||||
ones.
|
|
||||||
|
|
||||||
If you really implement an own passive data producer by this interface,
|
|
||||||
then beware: it can do anything and it can spoil everything.
|
|
||||||
|
|
||||||
In this case the functions (*read), (*get_size), (*set_size), (*free_data)
|
|
||||||
MUST be implemented by the application and attached to the object at
|
|
||||||
creation time.
|
|
||||||
Function (*read_sub) is allowed to be NULL or it MUST be implemented and
|
|
||||||
attached.
|
|
||||||
|
|
||||||
burn_source.refcount MUST be handled properly: If not exactly as many
|
|
||||||
references are freed as have been obtained, then either memory leaks or
|
|
||||||
corrupted memory are the consequence.
|
|
||||||
All objects which are referred to by *data must be kept existent until
|
|
||||||
(*free_data) is called via burn_source_free() by the last referer.
|
|
||||||
*/
|
*/
|
||||||
struct burn_source {
|
struct burn_source {
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ el_torito_set_load_seg;
|
|||||||
el_torito_set_load_size;
|
el_torito_set_load_size;
|
||||||
el_torito_set_no_bootable;
|
el_torito_set_no_bootable;
|
||||||
el_torito_set_selection_crit;
|
el_torito_set_selection_crit;
|
||||||
|
iso_conv_name_chars;
|
||||||
iso_data_source_new_from_file;
|
iso_data_source_new_from_file;
|
||||||
iso_data_source_ref;
|
iso_data_source_ref;
|
||||||
iso_data_source_unref;
|
iso_data_source_unref;
|
||||||
@ -88,6 +89,7 @@ iso_image_fs_get_volume_id;
|
|||||||
iso_image_generator_is_running;
|
iso_image_generator_is_running;
|
||||||
iso_image_get_abstract_file_id;
|
iso_image_get_abstract_file_id;
|
||||||
iso_image_get_all_boot_imgs;
|
iso_image_get_all_boot_imgs;
|
||||||
|
iso_image_get_app_use;
|
||||||
iso_image_get_application_id;
|
iso_image_get_application_id;
|
||||||
iso_image_get_attached_data;
|
iso_image_get_attached_data;
|
||||||
iso_image_get_biblio_file_id;
|
iso_image_get_biblio_file_id;
|
||||||
@ -98,8 +100,10 @@ iso_image_get_data_preparer_id;
|
|||||||
iso_image_get_mips_boot_files;
|
iso_image_get_mips_boot_files;
|
||||||
iso_image_get_msg_id;
|
iso_image_get_msg_id;
|
||||||
iso_image_get_publisher_id;
|
iso_image_get_publisher_id;
|
||||||
|
iso_image_get_pvd_times;
|
||||||
iso_image_get_root;
|
iso_image_get_root;
|
||||||
iso_image_get_session_md5;
|
iso_image_get_session_md5;
|
||||||
|
iso_image_get_sparc_core;
|
||||||
iso_image_get_system_area;
|
iso_image_get_system_area;
|
||||||
iso_image_get_system_id;
|
iso_image_get_system_id;
|
||||||
iso_image_get_volset_id;
|
iso_image_get_volset_id;
|
||||||
@ -112,6 +116,7 @@ iso_image_new;
|
|||||||
iso_image_ref;
|
iso_image_ref;
|
||||||
iso_image_remove_boot_image;
|
iso_image_remove_boot_image;
|
||||||
iso_image_set_abstract_file_id;
|
iso_image_set_abstract_file_id;
|
||||||
|
iso_image_set_app_use;
|
||||||
iso_image_set_application_id;
|
iso_image_set_application_id;
|
||||||
iso_image_set_biblio_file_id;
|
iso_image_set_biblio_file_id;
|
||||||
iso_image_set_boot_catalog_hidden;
|
iso_image_set_boot_catalog_hidden;
|
||||||
@ -121,6 +126,7 @@ iso_image_set_copyright_file_id;
|
|||||||
iso_image_set_data_preparer_id;
|
iso_image_set_data_preparer_id;
|
||||||
iso_image_set_ignore_aclea;
|
iso_image_set_ignore_aclea;
|
||||||
iso_image_set_publisher_id;
|
iso_image_set_publisher_id;
|
||||||
|
iso_image_set_sparc_core;
|
||||||
iso_image_set_system_id;
|
iso_image_set_system_id;
|
||||||
iso_image_set_volset_id;
|
iso_image_set_volset_id;
|
||||||
iso_image_set_volume_id;
|
iso_image_set_volume_id;
|
||||||
@ -298,6 +304,7 @@ iso_write_opts_set_iso_level;
|
|||||||
iso_write_opts_set_joliet;
|
iso_write_opts_set_joliet;
|
||||||
iso_write_opts_set_joliet_long_names;
|
iso_write_opts_set_joliet_long_names;
|
||||||
iso_write_opts_set_joliet_longer_paths;
|
iso_write_opts_set_joliet_longer_paths;
|
||||||
|
iso_write_opts_set_joliet_utf16;
|
||||||
iso_write_opts_set_max_37_char_filenames;
|
iso_write_opts_set_max_37_char_filenames;
|
||||||
iso_write_opts_set_ms_block;
|
iso_write_opts_set_ms_block;
|
||||||
iso_write_opts_set_no_force_dots;
|
iso_write_opts_set_no_force_dots;
|
||||||
|
@ -394,7 +394,7 @@ int lba512chs_to_buf(char **wpt, off_t lba, int head_count, int sector_count)
|
|||||||
int assess_isohybrid_gpt_apm(Ecma119Image *t, int *gpt_count, int gpt_idx[128],
|
int assess_isohybrid_gpt_apm(Ecma119Image *t, int *gpt_count, int gpt_idx[128],
|
||||||
int *apm_count, int flag)
|
int *apm_count, int flag)
|
||||||
{
|
{
|
||||||
int i, ilx_opts, j, ret;
|
int i, ilx_opts, j, ret, num_img;
|
||||||
uint32_t block_count;
|
uint32_t block_count;
|
||||||
uint8_t gpt_name[72];
|
uint8_t gpt_name[72];
|
||||||
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
static uint8_t zero_uuid[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
@ -412,7 +412,11 @@ int assess_isohybrid_gpt_apm(Ecma119Image *t, int *gpt_count, int gpt_idx[128],
|
|||||||
*gpt_count = 0;
|
*gpt_count = 0;
|
||||||
*apm_count = 0;
|
*apm_count = 0;
|
||||||
|
|
||||||
for (i = 0; i < t->catalog->num_bootimages; i++) {
|
if (t->catalog != NULL)
|
||||||
|
num_img = t->catalog->num_bootimages;
|
||||||
|
else
|
||||||
|
num_img = 0;
|
||||||
|
for (i = 0; i < num_img; i++) {
|
||||||
ilx_opts = t->catalog->bootimages[i]->isolinux_options;
|
ilx_opts = t->catalog->bootimages[i]->isolinux_options;
|
||||||
if (((ilx_opts >> 2) & 63) == 1 || ((ilx_opts >> 2) & 63) == 2) {
|
if (((ilx_opts >> 2) & 63) == 1 || ((ilx_opts >> 2) & 63) == 2) {
|
||||||
if (*gpt_count < 128)
|
if (*gpt_count < 128)
|
||||||
@ -451,7 +455,7 @@ int assess_isohybrid_gpt_apm(Ecma119Image *t, int *gpt_count, int gpt_idx[128],
|
|||||||
return ret;
|
return ret;
|
||||||
/* Prevent gap filling */
|
/* Prevent gap filling */
|
||||||
t->apm_req_flags |= 2;
|
t->apm_req_flags |= 2;
|
||||||
t->apm_block_size = 2048;
|
t->opts->apm_block_size = 2048;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -559,7 +563,7 @@ int make_isolinux_mbr(int32_t *img_blocks, Ecma119Image *t,
|
|||||||
uint32_t id, part, nominal_part_size;
|
uint32_t id, part, nominal_part_size;
|
||||||
off_t hd_img_blocks, hd_boot_lba;
|
off_t hd_img_blocks, hd_boot_lba;
|
||||||
char *wpt;
|
char *wpt;
|
||||||
uint32_t boot_lba, mbr_id;
|
uint32_t boot_lba;
|
||||||
int head_count, sector_count, ret;
|
int head_count, sector_count, ret;
|
||||||
int gpt_count = 0, gpt_idx[128], apm_count = 0, gpt_cursor;
|
int gpt_count = 0, gpt_idx[128], apm_count = 0, gpt_cursor;
|
||||||
/* For generating a weak random number */
|
/* For generating a weak random number */
|
||||||
@ -569,7 +573,6 @@ int make_isolinux_mbr(int32_t *img_blocks, Ecma119Image *t,
|
|||||||
hd_img_blocks = ((off_t) *img_blocks) * (off_t) 4;
|
hd_img_blocks = ((off_t) *img_blocks) * (off_t) 4;
|
||||||
|
|
||||||
boot_lba = t->bootsrc[0]->sections[0].block;
|
boot_lba = t->bootsrc[0]->sections[0].block;
|
||||||
mbr_id = 0;
|
|
||||||
head_count = t->partition_heads_per_cyl;
|
head_count = t->partition_heads_per_cyl;
|
||||||
sector_count = t->partition_secs_per_head;
|
sector_count = t->partition_secs_per_head;
|
||||||
|
|
||||||
@ -604,6 +607,8 @@ int make_isolinux_mbr(int32_t *img_blocks, Ecma119Image *t,
|
|||||||
gettimeofday(&tv, &tz);
|
gettimeofday(&tv, &tz);
|
||||||
id = 0xffffffff & (tv.tv_sec ^ (tv.tv_usec * 2000));
|
id = 0xffffffff & (tv.tv_sec ^ (tv.tv_usec * 2000));
|
||||||
lsb_to_buf(&wpt, id, 32, 0);
|
lsb_to_buf(&wpt, id, 32, 0);
|
||||||
|
} else {
|
||||||
|
wpt+= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write word 0 # Offset 444
|
/* write word 0 # Offset 444
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Thomas Schmitt
|
* Copyright (c) 2009 - 2013 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -497,7 +497,7 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
|
|||||||
|
|
||||||
if (node->type == LIBISO_FILE) {
|
if (node->type == LIBISO_FILE) {
|
||||||
file = (IsoFile *) node;
|
file = (IsoFile *) node;
|
||||||
if (file->from_old_session && target->appendable) {
|
if (file->from_old_session && target->opts->appendable) {
|
||||||
/* Look for checksums at various places */
|
/* Look for checksums at various places */
|
||||||
|
|
||||||
/* Try checksum directly stored with node */
|
/* Try checksum directly stored with node */
|
||||||
@ -527,19 +527,25 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
|
|||||||
if (md5_pt == NULL)
|
if (md5_pt == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = iso_node_lookup_attr(node, "isofs.cx", &value_length,
|
if (!target->opts->will_cancel) {
|
||||||
&value, 0);
|
ret = iso_node_lookup_attr(node, "isofs.cx", &value_length,
|
||||||
if (ret == 1 && value_length == 4) {
|
&value, 0);
|
||||||
for (i = 0; i < 4; i++)
|
if (ret == 1 && value_length == 4) {
|
||||||
idx = (idx << 8) | ((unsigned char *) value)[i];
|
for (i = 0; i < 4; i++)
|
||||||
if (idx > 0 && idx <= target->checksum_idx_counter) {
|
idx = (idx << 8) | ((unsigned char *) value)[i];
|
||||||
memcpy(target->checksum_buffer + 16 * idx, md5_pt, 16);
|
if (idx > 0 && idx <= target->checksum_idx_counter) {
|
||||||
|
memcpy(target->checksum_buffer + 16 * idx, md5_pt, 16);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if (value != NULL)
|
||||||
|
free(value);
|
||||||
|
|
||||||
|
/* >>> ts B30114 : It is unclear why these are removed here.
|
||||||
|
At least with the opts->will_cancel runs,
|
||||||
|
this is not appropriate.
|
||||||
|
*/
|
||||||
|
iso_node_remove_xinfo(node, checksum_md5_xinfo_func);
|
||||||
}
|
}
|
||||||
if (value != NULL)
|
|
||||||
free(value);
|
|
||||||
iso_node_remove_xinfo(node, checksum_md5_xinfo_func);
|
|
||||||
iso_node_remove_xinfo(node, checksum_cx_xinfo_func);
|
|
||||||
}
|
}
|
||||||
} else if (node->type == LIBISO_DIR) {
|
} else if (node->type == LIBISO_DIR) {
|
||||||
for (pos = ((IsoDir *) node)->children; pos != NULL; pos = pos->next) {
|
for (pos = ((IsoDir *) node)->children; pos != NULL; pos = pos->next) {
|
||||||
@ -565,8 +571,8 @@ int checksum_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t = writer->target;
|
t = writer->target;
|
||||||
|
|
||||||
t->checksum_array_pos = t->curblock;
|
t->checksum_array_pos = t->curblock;
|
||||||
/* (t->curblock already contains t->ms_block) */
|
/* (t->curblock already contains t->opts->ms_block) */
|
||||||
t->checksum_range_start = t->ms_block;
|
t->checksum_range_start = t->opts->ms_block;
|
||||||
size = (t->checksum_idx_counter + 2) / 128;
|
size = (t->checksum_idx_counter + 2) / 128;
|
||||||
if (size * 128 < t->checksum_idx_counter + 2)
|
if (size * 128 < t->checksum_idx_counter + 2)
|
||||||
size++;
|
size++;
|
||||||
@ -706,7 +712,7 @@ int checksum_writer_create(Ecma119Image *target)
|
|||||||
/* add this writer to image */
|
/* add this writer to image */
|
||||||
target->writers[target->nwriters++] = writer;
|
target->writers[target->nwriters++] = writer;
|
||||||
/* Account for superblock checksum tag */
|
/* Account for superblock checksum tag */
|
||||||
if (target->md5_session_checksum) {
|
if (target->opts->md5_session_checksum) {
|
||||||
target->checksum_sb_tag_pos = target->curblock;
|
target->checksum_sb_tag_pos = target->curblock;
|
||||||
target->curblock++;
|
target->curblock++;
|
||||||
}
|
}
|
||||||
@ -736,7 +742,7 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
|
|||||||
(unsigned int) (pos % 1000000000));
|
(unsigned int) (pos % 1000000000));
|
||||||
else
|
else
|
||||||
sprintf(postext, "%u", (unsigned int) pos);
|
sprintf(postext, "%u", (unsigned int) pos);
|
||||||
sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext);
|
sprintf(record, "%s %s ", t->opts->scdbackup_tag_parm, postext);
|
||||||
record_len = strlen(record);
|
record_len = strlen(record);
|
||||||
for (i = 0; i < 16; i++)
|
for (i = 0; i < 16; i++)
|
||||||
sprintf(record + record_len + 2 * i,
|
sprintf(record + record_len + 2 * i,
|
||||||
@ -758,8 +764,8 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
|
|||||||
block_len+= 32;
|
block_len+= 32;
|
||||||
tag_block[block_len++]= '\n';
|
tag_block[block_len++]= '\n';
|
||||||
|
|
||||||
if (t->scdbackup_tag_written != NULL)
|
if (t->opts->scdbackup_tag_written != NULL)
|
||||||
strncpy(t->scdbackup_tag_written, tag_block + line_start,
|
strncpy(t->opts->scdbackup_tag_written, tag_block + line_start,
|
||||||
block_len - line_start);
|
block_len - line_start);
|
||||||
ret = ISO_SUCCESS;
|
ret = ISO_SUCCESS;
|
||||||
ex:;
|
ex:;
|
||||||
@ -821,7 +827,7 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
|||||||
} else if (mode == 3) {
|
} else if (mode == 3) {
|
||||||
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos);
|
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos);
|
||||||
} else if (mode == 4) {
|
} else if (mode == 4) {
|
||||||
sprintf(tag_block + l, " session_start=%u", t->ms_block);
|
sprintf(tag_block + l, " session_start=%u", t->opts->ms_block);
|
||||||
}
|
}
|
||||||
strcat(tag_block + l, " md5=");
|
strcat(tag_block + l, " md5=");
|
||||||
l = strlen(tag_block);
|
l = strlen(tag_block);
|
||||||
@ -842,8 +848,8 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
|
|||||||
}
|
}
|
||||||
tag_block[l + 32] = '\n';
|
tag_block[l + 32] = '\n';
|
||||||
|
|
||||||
if (mode == 1 && t->scdbackup_tag_parm[0]) {
|
if (mode == 1 && t->opts->scdbackup_tag_parm[0]) {
|
||||||
if (t->ms_block > 0) {
|
if (t->opts->ms_block > 0) {
|
||||||
iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL);
|
iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL);
|
||||||
} else {
|
} else {
|
||||||
ret = iso_md5_write_scdbackup_tag(t, tag_block, 0);
|
ret = iso_md5_write_scdbackup_tag(t, tag_block, 0);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2011 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -139,6 +139,7 @@ int iso_node_xinfo_dispose_cloners(int flag)
|
|||||||
next = assoc->next;
|
next = assoc->next;
|
||||||
free((char *) assoc);
|
free((char *) assoc);
|
||||||
}
|
}
|
||||||
|
iso_xinfo_cloner_list= NULL;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,9 +345,9 @@ const char *iso_error_to_msg(int errcode)
|
|||||||
case ISO_WRONG_PVD:
|
case ISO_WRONG_PVD:
|
||||||
return "Wrong or damaged Primary Volume Descriptor";
|
return "Wrong or damaged Primary Volume Descriptor";
|
||||||
case ISO_WRONG_RR:
|
case ISO_WRONG_RR:
|
||||||
return "Wrong or damaged RR entry";
|
return "Wrong or damaged Rock Ridge entry";
|
||||||
case ISO_UNSUPPORTED_RR:
|
case ISO_UNSUPPORTED_RR:
|
||||||
return "Unsupported RR feature";
|
return "Unsupported Rock Ridge feature";
|
||||||
case ISO_WRONG_ECMA119:
|
case ISO_WRONG_ECMA119:
|
||||||
return "Wrong or damaged ECMA-119";
|
return "Wrong or damaged ECMA-119";
|
||||||
case ISO_UNSUPPORTED_ECMA119:
|
case ISO_UNSUPPORTED_ECMA119:
|
||||||
@ -360,9 +361,9 @@ const char *iso_error_to_msg(int errcode)
|
|||||||
case ISO_UNSUPPORTED_SUSP:
|
case ISO_UNSUPPORTED_SUSP:
|
||||||
return "Unsupported SUSP feature";
|
return "Unsupported SUSP feature";
|
||||||
case ISO_WRONG_RR_WARN:
|
case ISO_WRONG_RR_WARN:
|
||||||
return "Error on a RR entry that can be ignored";
|
return "Error on a Rock Ridge entry that can be ignored";
|
||||||
case ISO_SUSP_UNHANDLED:
|
case ISO_SUSP_UNHANDLED:
|
||||||
return "Error on a RR entry that can be ignored";
|
return "Unhandled SUSP entry";
|
||||||
case ISO_SUSP_MULTIPLE_ER:
|
case ISO_SUSP_MULTIPLE_ER:
|
||||||
return "Multiple ER SUSP entries found";
|
return "Multiple ER SUSP entries found";
|
||||||
case ISO_UNSUPPORTED_VD:
|
case ISO_UNSUPPORTED_VD:
|
||||||
@ -500,6 +501,20 @@ const char *iso_error_to_msg(int errcode)
|
|||||||
return "Symbolic link cannot be resolved";
|
return "Symbolic link cannot be resolved";
|
||||||
case ISO_DEEP_SYMLINK:
|
case ISO_DEEP_SYMLINK:
|
||||||
return "Too many chained symbolic links";
|
return "Too many chained symbolic links";
|
||||||
|
case ISO_BAD_ISO_FILETYPE:
|
||||||
|
return "Unrecognized file type in ISO image";
|
||||||
|
case ISO_NAME_NOT_UCS2:
|
||||||
|
return "Filename not suitable for character set UCS-2";
|
||||||
|
case ISO_IMPORT_COLLISION:
|
||||||
|
return "File name collision during ISO image import";
|
||||||
|
case ISO_HPPA_PALO_INCOMPL:
|
||||||
|
return "Incomplete HP-PA PALO boot parameters";
|
||||||
|
case ISO_HPPA_PALO_OFLOW:
|
||||||
|
return "HP-PA PALO boot address exceeds 2 GB";
|
||||||
|
case ISO_HPPA_PALO_NOTREG:
|
||||||
|
return "HP-PA PALO file is not a data file";
|
||||||
|
case ISO_HPPA_PALO_CMDLEN:
|
||||||
|
return "HP-PA PALO command line too long";
|
||||||
default:
|
default:
|
||||||
return "Unknown error";
|
return "Unknown error";
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2009 - 2011 Thomas Schmitt
|
* Copyright (c) 2009 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -1048,6 +1048,7 @@ void iso_node_set_sort_weight(IsoNode *node, int w)
|
|||||||
}
|
}
|
||||||
} else if (node->type == LIBISO_FILE) {
|
} else if (node->type == LIBISO_FILE) {
|
||||||
((IsoFile*)node)->sort_weight = w;
|
((IsoFile*)node)->sort_weight = w;
|
||||||
|
((IsoFile*)node)->explicit_weight = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1172,20 +1173,27 @@ int iso_node_is_valid_name(const char *name)
|
|||||||
|
|
||||||
/* guard against the empty string or big names... */
|
/* guard against the empty string or big names... */
|
||||||
if (name[0] == '\0')
|
if (name[0] == '\0')
|
||||||
return ISO_RR_NAME_RESERVED;
|
goto rr_reserved;
|
||||||
if (strlen(name) > LIBISOFS_NODE_NAME_MAX)
|
if (strlen(name) > LIBISOFS_NODE_NAME_MAX)
|
||||||
return ISO_RR_NAME_TOO_LONG;
|
return ISO_RR_NAME_TOO_LONG;
|
||||||
|
|
||||||
/* ...against "." and ".." names... */
|
/* ...against "." and ".." names... */
|
||||||
if (!strcmp(name, ".") || !strcmp(name, "..")) {
|
if (!strcmp(name, ".") || !strcmp(name, ".."))
|
||||||
return ISO_RR_NAME_RESERVED;
|
goto rr_reserved;
|
||||||
}
|
|
||||||
|
|
||||||
/* ...and against names with '/' */
|
/* ...and against names with '/' */
|
||||||
if (strchr(name, '/') != NULL) {
|
if (strchr(name, '/') != NULL)
|
||||||
return ISO_RR_NAME_RESERVED;
|
goto rr_reserved;
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
rr_reserved:;
|
||||||
|
/* # define Libisofs_debug_rr_reserveD */
|
||||||
|
#ifdef Libisofs_debug_rr_reserveD
|
||||||
|
fprintf(stderr, "libisofs_DEBUG: ISO_RR_NAME_RESERVED with '%s'\n", name);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ISO_RR_NAME_RESERVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1205,8 +1213,12 @@ int iso_node_is_valid_link_dest(const char *dest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* guard against the empty string or big dest... */
|
/* guard against the empty string or big dest... */
|
||||||
if (dest[0] == '\0')
|
if (dest[0] == '\0') {
|
||||||
|
#ifdef Libisofs_debug_rr_reserveD
|
||||||
|
fprintf(stderr, "libisofs_DEBUG: ISO_RR_NAME_RESERVED by empty link target\n");
|
||||||
|
#endif
|
||||||
return ISO_RR_NAME_RESERVED;
|
return ISO_RR_NAME_RESERVED;
|
||||||
|
}
|
||||||
if (strlen(dest) > LIBISOFS_NODE_PATH_MAX)
|
if (strlen(dest) > LIBISOFS_NODE_PATH_MAX)
|
||||||
return ISO_RR_PATH_TOO_LONG;
|
return ISO_RR_PATH_TOO_LONG;
|
||||||
|
|
||||||
@ -1430,6 +1442,8 @@ int iso_node_new_file(char *name, IsoStream *stream, IsoFile **file)
|
|||||||
new->node.type = LIBISO_FILE;
|
new->node.type = LIBISO_FILE;
|
||||||
new->node.name = name;
|
new->node.name = name;
|
||||||
new->node.mode = S_IFREG;
|
new->node.mode = S_IFREG;
|
||||||
|
new->from_old_session = 0;
|
||||||
|
new->explicit_weight = 0;
|
||||||
new->sort_weight = 0;
|
new->sort_weight = 0;
|
||||||
new->stream = stream;
|
new->stream = stream;
|
||||||
|
|
||||||
@ -2566,6 +2580,7 @@ int iso_node_set_ino(IsoNode *node, ino_t ino, int flag)
|
|||||||
ret = iso_stream_set_image_ino(file->stream, ino, 0);
|
ret = iso_stream_set_image_ino(file->stream, ino, 0);
|
||||||
if (ret < 0 || ret == 1)
|
if (ret < 0 || ret == 1)
|
||||||
return ret;
|
return ret;
|
||||||
|
/* ret == 0 means that the stream is not from loaded ISO image */
|
||||||
|
|
||||||
} else if (node->type == LIBISO_SYMLINK) {
|
} else if (node->type == LIBISO_SYMLINK) {
|
||||||
symlink = (IsoSymlink *) node;
|
symlink = (IsoSymlink *) node;
|
||||||
@ -2756,6 +2771,8 @@ int iso_node_cmp_ino(IsoNode *n1, IsoNode *n2, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @param flag bit0= delete isofs.cx rather than setting it
|
||||||
|
*/
|
||||||
int iso_file_set_isofscx(IsoFile *file, unsigned int checksum_index,
|
int iso_file_set_isofscx(IsoFile *file, unsigned int checksum_index,
|
||||||
int flag)
|
int flag)
|
||||||
{
|
{
|
||||||
@ -2765,9 +2782,14 @@ int iso_file_set_isofscx(IsoFile *file, unsigned int checksum_index,
|
|||||||
char *valuept;
|
char *valuept;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
|
valuept= (char *) value;
|
||||||
|
if (flag & 1) {
|
||||||
|
ret = iso_node_set_attrs((IsoNode *) file, (size_t) 1,
|
||||||
|
&names, value_lengths, &valuept, 4 | 8);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
for(i = 0; i < 4; i++)
|
for(i = 0; i < 4; i++)
|
||||||
value[3 - i] = (checksum_index >> (8 * i)) & 0xff;
|
value[3 - i] = (checksum_index >> (8 * i)) & 0xff;
|
||||||
valuept= (char *) value;
|
|
||||||
ret = iso_node_set_attrs((IsoNode *) file, (size_t) 1,
|
ret = iso_node_set_attrs((IsoNode *) file, (size_t) 1,
|
||||||
&names, value_lengths, &valuept, 2 | 8);
|
&names, value_lengths, &valuept, 2 | 8);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -149,8 +149,15 @@ struct Iso_File
|
|||||||
{
|
{
|
||||||
IsoNode node;
|
IsoNode node;
|
||||||
|
|
||||||
|
/* 1 = The node was loaded from an existing ISO image and still refers
|
||||||
|
to its data content there.
|
||||||
|
*/
|
||||||
unsigned int from_old_session : 1;
|
unsigned int from_old_session : 1;
|
||||||
|
|
||||||
|
/* 1 = The node got attributed a weight by iso_node_set_sort_weight().
|
||||||
|
*/
|
||||||
|
unsigned int explicit_weight : 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It sorts the order in which the file data is written to the CD image.
|
* It sorts the order in which the file data is written to the CD image.
|
||||||
* Higher weighting files are written at the beginning of image
|
* Higher weighting files are written at the beginning of image
|
||||||
|
@ -115,7 +115,7 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
|||||||
|
|
||||||
PX[0] = 'P';
|
PX[0] = 'P';
|
||||||
PX[1] = 'X';
|
PX[1] = 'X';
|
||||||
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10 ) {
|
if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10 ) {
|
||||||
PX[2] = 44;
|
PX[2] = 44;
|
||||||
} else {
|
} else {
|
||||||
PX[2] = 36;
|
PX[2] = 36;
|
||||||
@ -125,7 +125,7 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
|||||||
iso_bb(&PX[12], (uint32_t) n->nlink, 4);
|
iso_bb(&PX[12], (uint32_t) n->nlink, 4);
|
||||||
iso_bb(&PX[20], (uint32_t) px_get_uid(t, n), 4);
|
iso_bb(&PX[20], (uint32_t) px_get_uid(t, n), 4);
|
||||||
iso_bb(&PX[28], (uint32_t) px_get_gid(t, n), 4);
|
iso_bb(&PX[28], (uint32_t) px_get_gid(t, n), 4);
|
||||||
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10) {
|
if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10) {
|
||||||
iso_bb(&PX[36], (uint32_t) n->ino, 4);
|
iso_bb(&PX[36], (uint32_t) n->ino, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,11 +153,11 @@ int rrip_add_TF(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
|||||||
|
|
||||||
iso = n->node;
|
iso = n->node;
|
||||||
iso_datetime_7(&TF[5], t->replace_timestamps ? t->timestamp : iso->mtime,
|
iso_datetime_7(&TF[5], t->replace_timestamps ? t->timestamp : iso->mtime,
|
||||||
t->always_gmt);
|
t->opts->always_gmt);
|
||||||
iso_datetime_7(&TF[12], t->replace_timestamps ? t->timestamp : iso->atime,
|
iso_datetime_7(&TF[12], t->replace_timestamps ? t->timestamp : iso->atime,
|
||||||
t->always_gmt);
|
t->opts->always_gmt);
|
||||||
iso_datetime_7(&TF[19], t->replace_timestamps ? t->timestamp : iso->ctime,
|
iso_datetime_7(&TF[19], t->replace_timestamps ? t->timestamp : iso->ctime,
|
||||||
t->always_gmt);
|
t->opts->always_gmt);
|
||||||
return susp_append(t, susp, TF);
|
return susp_append(t, susp, TF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,29 +294,44 @@ int rrip_add_CL(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
|
|||||||
/**
|
/**
|
||||||
* Convert a RR filename to the requested charset. On any conversion error,
|
* Convert a RR filename to the requested charset. On any conversion error,
|
||||||
* the original name will be used.
|
* the original name will be used.
|
||||||
|
* @param flag bit0= do not issue error messages
|
||||||
*/
|
*/
|
||||||
static
|
int iso_get_rr_name(IsoWriteOpts *opts, char *input_charset,
|
||||||
char *get_rr_fname(Ecma119Image *t, const char *str)
|
char *output_charset, int imgid,
|
||||||
|
char *str, char **name, int flag)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char *name;
|
|
||||||
|
|
||||||
if (!strcmp(t->input_charset, t->output_charset)) {
|
if (!strcmp(input_charset, output_charset)) {
|
||||||
/* no conversion needed */
|
/* no conversion needed */
|
||||||
return strdup(str);
|
ret = iso_clone_mem(str, name, 0);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = strconv(str, t->input_charset, t->output_charset, &name);
|
ret = strconv(str, input_charset, output_charset, name);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* TODO we should check for possible cancelation */
|
/* TODO we should check for possible cancelation */
|
||||||
iso_msg_submit(t->image->id, ISO_FILENAME_WRONG_CHARSET, ret,
|
if (!(flag & 1))
|
||||||
"Charset conversion error. Can't convert %s from %s to %s",
|
iso_msg_submit(imgid, ISO_FILENAME_WRONG_CHARSET, ret,
|
||||||
str, t->input_charset, t->output_charset);
|
"Charset conversion error. Cannot convert %s from %s to %s",
|
||||||
|
str, input_charset, output_charset);
|
||||||
|
|
||||||
/* use the original name, it's the best we can do */
|
/* use the original name, it's the best we can do */
|
||||||
name = strdup(str);
|
ret = iso_clone_mem(str, name, 0);
|
||||||
|
return ISO_FILENAME_WRONG_CHARSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
char *get_rr_fname(Ecma119Image *t, char *str)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char *name = NULL;
|
||||||
|
|
||||||
|
ret = iso_get_rr_name(t->opts, t->input_charset, t->output_charset,
|
||||||
|
t->image->id, str, &name, 0);
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -542,7 +557,7 @@ int aaip_add_AL(Ecma119Image *t, struct susp_info *susp,
|
|||||||
int ret, done = 0, len, es_extra = 0;
|
int ret, done = 0, len, es_extra = 0;
|
||||||
uint8_t *aapt, *cpt;
|
uint8_t *aapt, *cpt;
|
||||||
|
|
||||||
if (!t->aaip_susp_1_10)
|
if (!t->opts->aaip_susp_1_10)
|
||||||
es_extra = 5;
|
es_extra = 5;
|
||||||
if (*sua_free < num_data + es_extra || *ce_len > 0) {
|
if (*sua_free < num_data + es_extra || *ce_len > 0) {
|
||||||
*ce_len += num_data + es_extra;
|
*ce_len += num_data + es_extra;
|
||||||
@ -553,7 +568,7 @@ int aaip_add_AL(Ecma119Image *t, struct susp_info *susp,
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
|
||||||
/* If AAIP enabled and announced by ER : Write ES field to announce AAIP */
|
/* If AAIP enabled and announced by ER : Write ES field to announce AAIP */
|
||||||
if (t->aaip && !t->aaip_susp_1_10) {
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
|
||||||
ret = susp_add_ES(t, susp, (*ce_len > 0), 1);
|
ret = susp_add_ES(t, susp, (*ce_len > 0), 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -606,7 +621,7 @@ int rrip_add_ER(Ecma119Image *t, struct susp_info *susp)
|
|||||||
{
|
{
|
||||||
unsigned char *ER;
|
unsigned char *ER;
|
||||||
|
|
||||||
if (!t->rrip_version_1_10) {
|
if (!t->opts->rrip_version_1_10) {
|
||||||
/*
|
/*
|
||||||
According to RRIP 1.12 this is the future form:
|
According to RRIP 1.12 this is the future form:
|
||||||
4.3 "Specification of the ER System Use Entry Values for RRIP"
|
4.3 "Specification of the ER System Use Entry Values for RRIP"
|
||||||
@ -851,7 +866,7 @@ int add_zf_field(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
|
|||||||
zisofs file header when inquired)
|
zisofs file header when inquired)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (t->appendable && file->from_old_session)
|
if (t->opts->appendable && file->from_old_session)
|
||||||
will_copy = 0;
|
will_copy = 0;
|
||||||
|
|
||||||
first_filter = first_stream = last_stream = iso_file_get_stream(file);
|
first_filter = first_stream = last_stream = iso_file_get_stream(file);
|
||||||
@ -1124,7 +1139,7 @@ int susp_calc_nm_sl_al(Ecma119Image *t, Ecma119Node *n, size_t space,
|
|||||||
/* obtain num_aapt from node */
|
/* obtain num_aapt from node */
|
||||||
xipt = NULL;
|
xipt = NULL;
|
||||||
num_aapt = 0;
|
num_aapt = 0;
|
||||||
if (t->aaip) {
|
if (t->opts->aaip) {
|
||||||
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
|
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
|
||||||
@ -1160,7 +1175,7 @@ int add_aa_string(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
|
|||||||
void *xipt;
|
void *xipt;
|
||||||
size_t num_aapt= 0;
|
size_t num_aapt= 0;
|
||||||
|
|
||||||
if (!t->aaip)
|
if (!t->opts->aaip)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
|
||||||
@ -1221,7 +1236,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
|||||||
su_size = 0;
|
su_size = 0;
|
||||||
|
|
||||||
/* If AAIP enabled and announced by ER : account for 5 bytes of ES */;
|
/* If AAIP enabled and announced by ER : account for 5 bytes of ES */;
|
||||||
if (t->aaip && !t->aaip_susp_1_10)
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10)
|
||||||
su_size += 5;
|
su_size += 5;
|
||||||
|
|
||||||
#ifdef Libisofs_with_rrip_rR
|
#ifdef Libisofs_with_rrip_rR
|
||||||
@ -1230,7 +1245,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* PX and TF, we are sure they always fit in SUA */
|
/* PX and TF, we are sure they always fit in SUA */
|
||||||
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10) {
|
if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10) {
|
||||||
su_size += 44 + 26;
|
su_size += 44 + 26;
|
||||||
} else {
|
} else {
|
||||||
su_size += 36 + 26;
|
su_size += 36 + 26;
|
||||||
@ -1247,7 +1262,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
|||||||
su_size += 4;
|
su_size += 4;
|
||||||
}
|
}
|
||||||
} else if(ecma119_is_dedicated_reloc_dir(t, n) &&
|
} else if(ecma119_is_dedicated_reloc_dir(t, n) &&
|
||||||
(t->rr_reloc_flags & 1)) {
|
(t->opts->rr_reloc_flags & 1)) {
|
||||||
/* The dedicated relocation directory shall be marked by RE */
|
/* The dedicated relocation directory shall be marked by RE */
|
||||||
su_size += 4;
|
su_size += 4;
|
||||||
}
|
}
|
||||||
@ -1274,7 +1289,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
|||||||
|
|
||||||
/* "." or ".." entry */
|
/* "." or ".." entry */
|
||||||
|
|
||||||
if (!t->rrip_version_1_10)
|
if (!t->opts->rrip_version_1_10)
|
||||||
su_size += 5; /* NM field */
|
su_size += 5; /* NM field */
|
||||||
|
|
||||||
if (type == 1 && n->parent == NULL) {
|
if (type == 1 && n->parent == NULL) {
|
||||||
@ -1285,12 +1300,12 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
|||||||
*/
|
*/
|
||||||
su_size += 7 + 28; /* SP + CE */
|
su_size += 7 + 28; /* SP + CE */
|
||||||
/* ER of RRIP */
|
/* ER of RRIP */
|
||||||
if (t->rrip_version_1_10) {
|
if (t->opts->rrip_version_1_10) {
|
||||||
*ce = 237;
|
*ce = 237;
|
||||||
} else {
|
} else {
|
||||||
*ce = 182;
|
*ce = 182;
|
||||||
}
|
}
|
||||||
if (t->aaip && !t->aaip_susp_1_10) {
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
|
||||||
*ce += 160; /* ER of AAIP */
|
*ce += 160; /* ER of AAIP */
|
||||||
}
|
}
|
||||||
/* Compute length of AAIP string of root node */
|
/* Compute length of AAIP string of root node */
|
||||||
@ -1394,7 +1409,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If AAIP enabled and announced by ER : Announce RRIP by ES */
|
/* If AAIP enabled and announced by ER : Announce RRIP by ES */
|
||||||
if (t->aaip && !t->aaip_susp_1_10) {
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
|
||||||
ret = susp_add_ES(t, info, 0, 0);
|
ret = susp_add_ES(t, info, 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto add_susp_cleanup;
|
goto add_susp_cleanup;
|
||||||
@ -1437,7 +1452,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(ecma119_is_dedicated_reloc_dir(t, n) &&
|
} else if(ecma119_is_dedicated_reloc_dir(t, n) &&
|
||||||
(t->rr_reloc_flags & 1)) {
|
(t->opts->rr_reloc_flags & 1)) {
|
||||||
/* The dedicated relocation directory shall be marked by RE */
|
/* The dedicated relocation directory shall be marked by RE */
|
||||||
ret = rrip_add_RE(t, node, info);
|
ret = rrip_add_RE(t, node, info);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -1740,7 +1755,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
|||||||
/* "." or ".." entry */
|
/* "." or ".." entry */
|
||||||
|
|
||||||
/* write the NM entry */
|
/* write the NM entry */
|
||||||
if (t->rrip_version_1_10) {
|
if (t->opts->rrip_version_1_10) {
|
||||||
/* RRIP-1.10:
|
/* RRIP-1.10:
|
||||||
"NM" System Use Fields recorded for the ISO 9660 directory
|
"NM" System Use Fields recorded for the ISO 9660 directory
|
||||||
records with names (00) and (01), used to designate the
|
records with names (00) and (01), used to designate the
|
||||||
@ -1780,12 +1795,12 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
|||||||
* Note that SP entry was already added above
|
* Note that SP entry was already added above
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (t->rrip_version_1_10) {
|
if (t->opts->rrip_version_1_10) {
|
||||||
rrip_er_len = 237;
|
rrip_er_len = 237;
|
||||||
} else {
|
} else {
|
||||||
rrip_er_len = 182;
|
rrip_er_len = 182;
|
||||||
}
|
}
|
||||||
if (t->aaip && !t->aaip_susp_1_10) {
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
|
||||||
aaip_er_len = 160;
|
aaip_er_len = 160;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1804,7 +1819,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto add_susp_cleanup;
|
goto add_susp_cleanup;
|
||||||
}
|
}
|
||||||
if (t->aaip && !t->aaip_susp_1_10) {
|
if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
|
||||||
ret = aaip_add_ER(t, info, 0);
|
ret = aaip_add_ER(t, info, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto add_susp_cleanup;
|
goto add_susp_cleanup;
|
||||||
|
@ -346,4 +346,13 @@ int read_zisofs_ZF(struct susp_sys_user_entry *zf, uint8_t algorithm[2],
|
|||||||
uint8_t *header_size_div4, uint8_t *block_size_log2,
|
uint8_t *header_size_div4, uint8_t *block_size_log2,
|
||||||
uint32_t *uncompressed_size, int flag);
|
uint32_t *uncompressed_size, int flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a RR filename to the requested charset. On any conversion error,
|
||||||
|
* the original name will be used.
|
||||||
|
* @param flag bit0= do not issue error messages
|
||||||
|
*/
|
||||||
|
int iso_get_rr_name(IsoWriteOpts *opts, char *input_charset,
|
||||||
|
char *output_charset, int imgid,
|
||||||
|
char *str, char **name, int flag);
|
||||||
|
|
||||||
#endif /* LIBISO_ROCKRIDGE_H */
|
#endif /* LIBISO_ROCKRIDGE_H */
|
||||||
|
@ -890,17 +890,27 @@ void iso_stream_get_file_name(IsoStream *stream, char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* @param flag bit0= Obtain most fundamental stream */
|
||||||
IsoStream *iso_stream_get_input_stream(IsoStream *stream, int flag)
|
IsoStream *iso_stream_get_input_stream(IsoStream *stream, int flag)
|
||||||
{
|
{
|
||||||
IsoStreamIface* class;
|
IsoStreamIface* class;
|
||||||
|
IsoStream *result = NULL, *next;
|
||||||
|
|
||||||
if (stream == NULL) {
|
if (stream == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
class = stream->class;
|
while (1) {
|
||||||
if (class->version < 2)
|
class = stream->class;
|
||||||
return NULL;
|
if (class->version < 2)
|
||||||
return class->get_input_stream(stream, 0);
|
return result;
|
||||||
|
next = class->get_input_stream(stream, 0);
|
||||||
|
if (next == NULL)
|
||||||
|
return result;
|
||||||
|
result = next;
|
||||||
|
if (!(flag & 1))
|
||||||
|
return result;
|
||||||
|
stream = result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *iso_stream_get_source_path(IsoStream *stream, int flag)
|
char *iso_stream_get_source_path(IsoStream *stream, int flag)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Vreixo Formoso
|
* Copyright (c) 2008 Vreixo Formoso
|
||||||
* Copyright (c) 2010 - 2012 Thomas Schmitt
|
* Copyright (c) 2010 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -27,6 +27,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
/* for gettimeofday() */
|
/* for gettimeofday() */
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
@ -71,21 +72,25 @@ static int precompute_gpt(Ecma119Image *t);
|
|||||||
/*
|
/*
|
||||||
* @param flag bit0= img_blocks is start address rather than end address:
|
* @param flag bit0= img_blocks is start address rather than end address:
|
||||||
do not subtract 1
|
do not subtract 1
|
||||||
|
bit1= img_blocks is counted in 512-byte units rather than 2 KiB
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
void iso_compute_cyl_head_sec(uint32_t *img_blocks, int hpc, int sph,
|
void iso_compute_cyl_head_sec(uint64_t img_blocks, int hpc, int sph,
|
||||||
uint32_t *end_lba, uint32_t *end_sec,
|
uint32_t *end_lba, uint32_t *end_sec,
|
||||||
uint32_t *end_head, uint32_t *end_cyl, int flag)
|
uint32_t *end_head, uint32_t *end_cyl, int flag)
|
||||||
{
|
{
|
||||||
uint32_t secs;
|
uint64_t secs;
|
||||||
|
|
||||||
/* Partition table unit is 512 bytes per sector, ECMA-119 unit is 2048 */
|
if(flag & 2)
|
||||||
if (*img_blocks >= 0x40000000)
|
secs = img_blocks;
|
||||||
*img_blocks = 0x40000000 - 1; /* truncate rather than roll over */
|
|
||||||
if (flag & 1)
|
|
||||||
secs = *end_lba = *img_blocks * 4; /* first valid 512-lba */
|
|
||||||
else
|
else
|
||||||
secs = *end_lba = *img_blocks * 4 - 1; /* last valid 512-lba */
|
secs = img_blocks * 4;
|
||||||
|
if (secs > (uint64_t) 0xfffffffc)
|
||||||
|
secs = 0xfffffffc; /* truncate rather than roll over */
|
||||||
|
if (flag & 1)
|
||||||
|
*end_lba = secs; /* first valid 512-lba */
|
||||||
|
else
|
||||||
|
secs = *end_lba = secs - 1; /* last valid 512-lba */
|
||||||
*end_cyl = secs / (sph * hpc);
|
*end_cyl = secs / (sph * hpc);
|
||||||
secs -= *end_cyl * sph * hpc;
|
secs -= *end_cyl * sph * hpc;
|
||||||
*end_head = secs / sph;
|
*end_head = secs / sph;
|
||||||
@ -121,23 +126,42 @@ static uint32_t compute_partition_size(char *disk_path, uint32_t *size,
|
|||||||
*/
|
*/
|
||||||
int iso_compute_append_partitions(Ecma119Image *t, int flag)
|
int iso_compute_append_partitions(Ecma119Image *t, int flag)
|
||||||
{
|
{
|
||||||
int ret, i, sa_type;
|
int ret, i, sa_type, cyl_align, cyl_size = 0;
|
||||||
uint32_t pos, size, add_pos = 0;
|
uint32_t pos, size, add_pos = 0;
|
||||||
|
|
||||||
sa_type = (t->system_area_options >> 2) & 0x3f;
|
sa_type = (t->system_area_options >> 2) & 0x3f;
|
||||||
pos = (t->vol_space_size + t->ms_block);
|
cyl_align = (t->system_area_options >> 8) & 0x3;
|
||||||
|
if (sa_type == 0 && cyl_align == 3) {
|
||||||
|
cyl_size = t->partition_heads_per_cyl * t->partition_secs_per_head;
|
||||||
|
if (cyl_size % 4)
|
||||||
|
cyl_size = 0;
|
||||||
|
else
|
||||||
|
cyl_size /= 4;
|
||||||
|
}
|
||||||
|
pos = (t->vol_space_size + t->opts->ms_block);
|
||||||
for (i = 0; i < ISO_MAX_PARTITIONS; i++) {
|
for (i = 0; i < ISO_MAX_PARTITIONS; i++) {
|
||||||
if (t->appended_partitions[i] == NULL)
|
if (t->opts->appended_partitions[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (t->appended_partitions[i][0] == 0)
|
if (t->opts->appended_partitions[i][0] == 0)
|
||||||
continue;
|
continue;
|
||||||
ret = compute_partition_size(t->appended_partitions[i], &size, 0);
|
ret = compute_partition_size(t->opts->appended_partitions[i], &size,
|
||||||
|
0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (sa_type == 3 && (pos % ISO_SUN_CYL_SIZE))
|
add_pos = 0;
|
||||||
|
if (sa_type == 3 && (pos % ISO_SUN_CYL_SIZE)) {
|
||||||
add_pos = ISO_SUN_CYL_SIZE - (pos % ISO_SUN_CYL_SIZE);
|
add_pos = ISO_SUN_CYL_SIZE - (pos % ISO_SUN_CYL_SIZE);
|
||||||
|
} else if (cyl_size > 0 && (pos % cyl_size)) {
|
||||||
|
add_pos = cyl_size - (pos % cyl_size);
|
||||||
|
}
|
||||||
t->appended_part_prepad[i] = add_pos;
|
t->appended_part_prepad[i] = add_pos;
|
||||||
t->appended_part_start[i] = pos + add_pos;
|
t->appended_part_start[i] = pos + add_pos;
|
||||||
|
|
||||||
|
if (cyl_size > 0 && (size % cyl_size)) {
|
||||||
|
/* Obey cylinder alignment (missing data will be written as
|
||||||
|
zeros by iso_write_partition_file()) */
|
||||||
|
size += cyl_size - (size % cyl_size);
|
||||||
|
}
|
||||||
t->appended_part_size[i] = size;
|
t->appended_part_size[i] = size;
|
||||||
pos += add_pos + size;
|
pos += add_pos + size;
|
||||||
t->total_size += (add_pos + size) * 2048;
|
t->total_size += (add_pos + size) * 2048;
|
||||||
@ -146,10 +170,12 @@ int iso_compute_append_partitions(Ecma119Image *t, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Note: partition_offset and partition_size are counted in 2048 blocks
|
/* @param flag
|
||||||
|
bit1= partition_offset and partition_size are counted in
|
||||||
|
blocks of 512 rather than 2048
|
||||||
*/
|
*/
|
||||||
static int write_mbr_partition_entry(int partition_number, int partition_type,
|
static int write_mbr_partition_entry(int partition_number, int partition_type,
|
||||||
uint32_t partition_offset, uint32_t partition_size,
|
uint64_t partition_offset, uint64_t partition_size,
|
||||||
int sph, int hpc, uint8_t *buf, int flag)
|
int sph, int hpc, uint8_t *buf, int flag)
|
||||||
{
|
{
|
||||||
uint8_t *wpt;
|
uint8_t *wpt;
|
||||||
@ -159,10 +185,12 @@ static int write_mbr_partition_entry(int partition_number, int partition_type,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
after_end = partition_offset + partition_size;
|
after_end = partition_offset + partition_size;
|
||||||
iso_compute_cyl_head_sec(&partition_offset, hpc, sph,
|
iso_compute_cyl_head_sec((uint64_t) partition_offset, hpc, sph,
|
||||||
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
&start_lba, &start_sec, &start_head, &start_cyl,
|
||||||
iso_compute_cyl_head_sec(&after_end, hpc, sph,
|
1 | (flag & 2));
|
||||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
iso_compute_cyl_head_sec((uint64_t) after_end, hpc, sph,
|
||||||
|
&end_lba, &end_sec, &end_head, &end_cyl,
|
||||||
|
(flag & 2));
|
||||||
wpt = buf + 446 + (partition_number - 1) * 16;
|
wpt = buf + 446 + (partition_number - 1) * 16;
|
||||||
|
|
||||||
/* Not bootable */
|
/* Not bootable */
|
||||||
@ -225,7 +253,7 @@ int make_grub_msdos_label(uint32_t img_blocks, int sph, int hpc,
|
|||||||
uint32_t end_lba, end_sec, end_head, end_cyl;
|
uint32_t end_lba, end_sec, end_head, end_cyl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
iso_compute_cyl_head_sec(&img_blocks, hpc, sph,
|
iso_compute_cyl_head_sec((uint64_t) img_blocks, hpc, sph,
|
||||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||||
|
|
||||||
/* 1) Zero-fill 446-510 */
|
/* 1) Zero-fill 446-510 */
|
||||||
@ -289,9 +317,9 @@ int iso_offset_partition_start(uint32_t img_blocks, uint32_t partition_offset,
|
|||||||
uint32_t start_lba, start_sec, start_head, start_cyl;
|
uint32_t start_lba, start_sec, start_head, start_cyl;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
iso_compute_cyl_head_sec(&partition_offset, hpc, sph,
|
iso_compute_cyl_head_sec((uint64_t) partition_offset, hpc, sph,
|
||||||
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
||||||
iso_compute_cyl_head_sec(&img_blocks, hpc, sph,
|
iso_compute_cyl_head_sec((uint64_t) img_blocks, hpc, sph,
|
||||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||||
wpt = buf + 446;
|
wpt = buf + 446;
|
||||||
|
|
||||||
@ -672,14 +700,15 @@ static int write_sun_partition_entry(int partition_number,
|
|||||||
*/
|
*/
|
||||||
static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, i;
|
||||||
|
uint64_t blk;
|
||||||
|
|
||||||
/* Bytes 512 to 32767 may come from image or external file */
|
/* Bytes 512 to 32767 may come from image or external file */
|
||||||
memset(buf, 0, 512);
|
memset(buf, 0, 512);
|
||||||
|
|
||||||
/* 0 - 127 | label | ASCII Label */
|
/* 0 - 127 | label | ASCII Label */
|
||||||
if (t->ascii_disc_label[0])
|
if (t->opts->ascii_disc_label[0])
|
||||||
strncpy((char *) buf, t->ascii_disc_label, 128);
|
strncpy((char *) buf, t->opts->ascii_disc_label, 128);
|
||||||
else
|
else
|
||||||
strcpy((char *) buf,
|
strcpy((char *) buf,
|
||||||
"CD-ROM Disc with Sun sparc boot created by libisofs");
|
"CD-ROM Disc with Sun sparc boot created by libisofs");
|
||||||
@ -714,10 +743,20 @@ static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
|||||||
/* 508 - 509 | 0xdabe | Magic Number */
|
/* 508 - 509 | 0xdabe | Magic Number */
|
||||||
iso_msb(buf + 508, 0xdabe, 2);
|
iso_msb(buf + 508, 0xdabe, 2);
|
||||||
|
|
||||||
|
if (t->sparc_core_src != NULL) {
|
||||||
|
/* May be used for grub-sparc. */
|
||||||
|
blk= ((uint64_t) t->sparc_core_src->sections[0].block) *
|
||||||
|
(uint64_t) 2048;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
buf[Libisofs_grub2_sparc_patch_adr_poS + i] = blk >> ((7 - i) * 8);
|
||||||
|
iso_msb(buf + Libisofs_grub2_sparc_patch_size_poS,
|
||||||
|
t->sparc_core_src->sections[0].size, 4);
|
||||||
|
}
|
||||||
|
|
||||||
/* Set partition 1 to describe ISO image and compute checksum */
|
/* Set partition 1 to describe ISO image and compute checksum */
|
||||||
t->appended_part_start[0] = 0;
|
t->appended_part_start[0] = 0;
|
||||||
t->appended_part_size[0] = t->curblock;
|
t->appended_part_size[0] = t->curblock;
|
||||||
ret = write_sun_partition_entry(1, t->appended_partitions,
|
ret = write_sun_partition_entry(1, t->opts->appended_partitions,
|
||||||
t->appended_part_start, t->appended_part_size,
|
t->appended_part_start, t->appended_part_size,
|
||||||
ISO_SUN_CYL_SIZE, buf, 0);
|
ISO_SUN_CYL_SIZE, buf, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -726,6 +765,142 @@ static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int hppa_palo_get_filepar(Ecma119Image *t, char *path,
|
||||||
|
uint32_t *adr, uint32_t *len, int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
IsoNode *iso_node;
|
||||||
|
Ecma119Node *ecma_node;
|
||||||
|
off_t adr64;
|
||||||
|
|
||||||
|
ret = boot_nodes_from_iso_path(t, path,
|
||||||
|
&iso_node, &ecma_node, "HP-PA PALO boot file", 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (iso_node_get_type(iso_node) != LIBISO_FILE) {
|
||||||
|
iso_msg_submit(t->image->id, ISO_HPPA_PALO_NOTREG, 0,
|
||||||
|
"HP-PA PALO file is not a data file");
|
||||||
|
return ISO_HPPA_PALO_NOTREG;
|
||||||
|
}
|
||||||
|
adr64 = ((off_t) 2048) * (off_t) ecma_node->info.file->sections[0].block;
|
||||||
|
if (adr64 > 0x7fffffff) {
|
||||||
|
iso_msg_submit(t->image->id, ISO_HPPA_PALO_OFLOW, 0,
|
||||||
|
"HP-PA PALO boot address exceeds 2 GB");
|
||||||
|
return ISO_HPPA_PALO_OFLOW;
|
||||||
|
}
|
||||||
|
*adr = adr64;
|
||||||
|
*len = ecma_node->info.file->sections[0].size;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write HP-PA PALO boot sector. See doc/boot_sectors.txt
|
||||||
|
*
|
||||||
|
* learned from cdrkit-1.1.10/genisoimage/boot-hppa.c
|
||||||
|
* by Steve McIntyre <steve@einval.com>
|
||||||
|
* who states "Heavily inspired by palo"
|
||||||
|
* Public mail conversations with Helge Deller, beginning with
|
||||||
|
* https://lists.debian.org/debian-hppa/2014/01/msg00016.html
|
||||||
|
* http://git.kernel.org/cgit/linux/kernel/git/deller/palo.git/tree/lib/
|
||||||
|
* (especially struct firstblock in common.h and struct partition in part.h)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int make_hppa_palo_sector(Ecma119Image *t, uint8_t *buf, int hdrversion,
|
||||||
|
int flag)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
IsoImage *img;
|
||||||
|
uint32_t adr, len;
|
||||||
|
|
||||||
|
img = t->image;
|
||||||
|
if (img->hppa_cmdline == NULL && img->hppa_bootloader == NULL &&
|
||||||
|
img->hppa_kernel_32 == NULL && img->hppa_kernel_64 == NULL &&
|
||||||
|
img->hppa_ramdisk == NULL)
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
if (img->hppa_cmdline == NULL || img->hppa_bootloader == NULL ||
|
||||||
|
img->hppa_kernel_32 == NULL || img->hppa_kernel_64 == NULL ||
|
||||||
|
img->hppa_ramdisk == NULL) {
|
||||||
|
iso_msg_submit(img->id, ISO_HPPA_PALO_INCOMPL, 0,
|
||||||
|
"Incomplete HP-PA PALO boot parameters");
|
||||||
|
return ISO_HPPA_PALO_INCOMPL;
|
||||||
|
}
|
||||||
|
if (hdrversion == 4) {
|
||||||
|
/* Bytes 256 to 32767 may come from loaded ISO image or external file */
|
||||||
|
memset(buf, 0, 256);
|
||||||
|
} else if(hdrversion == 5) {
|
||||||
|
memset(buf, 0, 512);
|
||||||
|
memset(buf + 1024, 0, 1024);
|
||||||
|
} else {
|
||||||
|
iso_msg_submit(img->id, ISO_WRONG_ARG_VALUE, 0,
|
||||||
|
"Unsupported HP-PA PALO header version %d (can do 4 or 5)",
|
||||||
|
hdrversion);
|
||||||
|
return ISO_WRONG_ARG_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Magic */
|
||||||
|
iso_msb(buf + 0, 0x8000, 2);
|
||||||
|
/* Name of boot loader */
|
||||||
|
memcpy(buf + 2, "PALO", 5);
|
||||||
|
/* Version */
|
||||||
|
buf[7] = hdrversion;
|
||||||
|
|
||||||
|
/* Byte address and byte count of the "HPPA 32-bit kernel" file
|
||||||
|
*/
|
||||||
|
ret = hppa_palo_get_filepar(t, img->hppa_kernel_32, &adr, &len, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
iso_msb(buf + 8, adr, 4);
|
||||||
|
iso_msb(buf + 12, len, 4);
|
||||||
|
|
||||||
|
/* Byte address and byte count of the "HPPA ramdisk" file
|
||||||
|
*/
|
||||||
|
ret = hppa_palo_get_filepar(t, img->hppa_ramdisk, &adr, &len, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
iso_msb(buf + 16, adr, 4);
|
||||||
|
iso_msb(buf + 20, len, 4);
|
||||||
|
|
||||||
|
if (hdrversion == 4) {
|
||||||
|
/* "Command line" */
|
||||||
|
if (strlen(img->hppa_cmdline) > 127) {
|
||||||
|
iso_msg_submit(img->id, ISO_HPPA_PALO_CMDLEN, 0,
|
||||||
|
"HP-PA PALO command line too long");
|
||||||
|
return ISO_HPPA_PALO_CMDLEN;
|
||||||
|
}
|
||||||
|
memcpy(buf + 24, img->hppa_cmdline, strlen(img->hppa_cmdline) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Byte address and byte count of the "HPPA 64-bit kernel" file
|
||||||
|
*/
|
||||||
|
ret = hppa_palo_get_filepar(t, img->hppa_kernel_64, &adr, &len, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
iso_msb(buf + 232, adr, 4);
|
||||||
|
iso_msb(buf + 236, len, 4);
|
||||||
|
|
||||||
|
/* Byte address and byte count of the "HPPA bootloader" file
|
||||||
|
*/
|
||||||
|
ret = hppa_palo_get_filepar(t, img->hppa_bootloader, &adr, &len, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
iso_msb(buf + 240, adr, 4);
|
||||||
|
iso_msb(buf + 244, len, 4);
|
||||||
|
|
||||||
|
/* >>> ??? iso_msb(buf + 248, ipl_entry, 4); */
|
||||||
|
|
||||||
|
if (hdrversion == 5) {
|
||||||
|
if (strlen(img->hppa_cmdline) > 1023) {
|
||||||
|
iso_msg_submit(img->id, ISO_HPPA_PALO_CMDLEN, 0,
|
||||||
|
"HP-PA PALO command line too long");
|
||||||
|
return ISO_HPPA_PALO_CMDLEN;
|
||||||
|
}
|
||||||
|
memcpy(buf + 1024, img->hppa_cmdline, strlen(img->hppa_cmdline) + 1);
|
||||||
|
}
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Convenience frontend for iso_register_apm_entry().
|
/* Convenience frontend for iso_register_apm_entry().
|
||||||
name and type are 0-terminated strings.
|
name and type are 0-terminated strings.
|
||||||
*/
|
*/
|
||||||
@ -775,7 +950,7 @@ int iso_quick_gpt_entry(Ecma119Image *t,
|
|||||||
|
|
||||||
|
|
||||||
int iso_quick_mbr_entry(Ecma119Image *t,
|
int iso_quick_mbr_entry(Ecma119Image *t,
|
||||||
uint32_t start_block, uint32_t block_count,
|
uint64_t start_block, uint64_t block_count,
|
||||||
uint8_t type_byte, uint8_t status_byte,
|
uint8_t type_byte, uint8_t status_byte,
|
||||||
int desired_slot)
|
int desired_slot)
|
||||||
{
|
{
|
||||||
@ -861,7 +1036,7 @@ static int iso_write_apm_entry(Ecma119Image *t, int apm_block_size,
|
|||||||
else
|
else
|
||||||
block_fac = 2048 / apm_block_size;
|
block_fac = 2048 / apm_block_size;
|
||||||
|
|
||||||
memset(buf, apm_block_size, 0);
|
memset(buf, 0, apm_block_size);
|
||||||
wpt = buf;
|
wpt = buf;
|
||||||
|
|
||||||
/* Signature */
|
/* Signature */
|
||||||
@ -918,8 +1093,11 @@ static int fill_apm_gaps(Ecma119Image *t, uint32_t img_blocks)
|
|||||||
uint32_t part_end, goal, block_fac = 1;
|
uint32_t part_end, goal, block_fac = 1;
|
||||||
char gap_name[33];
|
char gap_name[33];
|
||||||
|
|
||||||
if (t->apm_req_flags & 4)
|
if (t->apm_req_flags & 4) {
|
||||||
block_fac = 2048 / t->apm_block_size;
|
if (t->opts->apm_block_size == 0)
|
||||||
|
t->opts->apm_block_size = 2048;
|
||||||
|
block_fac = 2048 / t->opts->apm_block_size;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find out whether an entry with start_block <= 1 is requested */
|
/* Find out whether an entry with start_block <= 1 is requested */
|
||||||
for (i = 0; i < t->apm_req_count; i++) {
|
for (i = 0; i < t->apm_req_count; i++) {
|
||||||
@ -1009,7 +1187,7 @@ static int rectify_apm(Ecma119Image *t)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (t->gpt_req_count > 0 &&
|
if (t->gpt_req_count > 0 &&
|
||||||
t->apm_block_size != 2048 && t->apm_req_count > 0) {
|
t->opts->apm_block_size != 2048 && t->apm_req_count > 0) {
|
||||||
iso_msgs_submit(0,
|
iso_msgs_submit(0,
|
||||||
"GPT and APM requested. APM block size would have to be 2048.",
|
"GPT and APM requested. APM block size would have to be 2048.",
|
||||||
0, "FAILURE", 0);
|
0, "FAILURE", 0);
|
||||||
@ -1038,12 +1216,20 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
|
|||||||
0x45, 0x52, 0x02, 0x00, 0xeb, 0x02, 0xff, 0xff
|
0x45, 0x52, 0x02, 0x00, 0xeb, 0x02, 0xff, 0xff
|
||||||
};
|
};
|
||||||
|
|
||||||
if (t->apm_req_flags & 4)
|
|
||||||
block_fac = 2048 / t->apm_block_size;
|
|
||||||
|
|
||||||
if (t->apm_req_count <= 0)
|
if (t->apm_req_count <= 0)
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
|
if (t->opts->apm_block_size == 0) {
|
||||||
|
/* One cannot be sure that all GPT partitions are registered
|
||||||
|
already. So it is necessary to choose the block size which is
|
||||||
|
combinable with GPT but not mountable on Linux.
|
||||||
|
*/
|
||||||
|
t->opts->apm_block_size = 2048;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (t->apm_req_flags & 4)
|
||||||
|
block_fac = 2048 / t->opts->apm_block_size;
|
||||||
|
|
||||||
if (!(t->apm_req_flags & 2)) {
|
if (!(t->apm_req_flags & 2)) {
|
||||||
/* Gaps have been filled. Care for the final one */
|
/* Gaps have been filled. Care for the final one */
|
||||||
/* Adjust last partition to img_size. This size was not known when the
|
/* Adjust last partition to img_size. This size was not known when the
|
||||||
@ -1059,7 +1245,7 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If block size is larger than 512, then not all 63 entries will fit */
|
/* If block size is larger than 512, then not all 63 entries will fit */
|
||||||
if ((t->apm_req_count + 1) * t->apm_block_size > 32768)
|
if ((t->apm_req_count + 1) * t->opts->apm_block_size > 32768)
|
||||||
return ISO_BOOT_TOO_MANY_APM;
|
return ISO_BOOT_TOO_MANY_APM;
|
||||||
|
|
||||||
/* Block 1 describes the APM itself */
|
/* Block 1 describes the APM itself */
|
||||||
@ -1071,15 +1257,15 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
|
|||||||
possible MBR.
|
possible MBR.
|
||||||
*/
|
*/
|
||||||
memcpy(buf, block0_template, 8);
|
memcpy(buf, block0_template, 8);
|
||||||
buf[2]= (t->apm_block_size >> 8) & 0xff;
|
buf[2]= (t->opts->apm_block_size >> 8) & 0xff;
|
||||||
buf[3]= 0;
|
buf[3]= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write APM Block 1 to t->apm_req_count */
|
/* Write APM Block 1 to t->apm_req_count */
|
||||||
for (i = 0; i < t->apm_req_count; i++) {
|
for (i = 0; i < t->apm_req_count; i++) {
|
||||||
ret = iso_write_apm_entry(t, t->apm_block_size, t->apm_req[i],
|
ret = iso_write_apm_entry(t, t->opts->apm_block_size, t->apm_req[i],
|
||||||
buf + (i + 1) * t->apm_block_size, t->apm_req_count,
|
buf + (i + 1) * t->opts->apm_block_size, t->apm_req_count,
|
||||||
i == 0);
|
i == 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1096,10 +1282,11 @@ static int iso_write_mbr(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
|
|
||||||
/* <<< Dummy mock-up */
|
/* <<< Dummy mock-up */
|
||||||
if (t->mbr_req_count <= 0) {
|
if (t->mbr_req_count <= 0) {
|
||||||
ret = iso_quick_mbr_entry(t, 0, 0, 0xee, 0, 0);
|
ret = iso_quick_mbr_entry(t, (uint64_t) 0, (uint64_t) 0, 0xee, 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
ret = iso_quick_mbr_entry(t, 100, 0, 0x0c, 0x80, 1);
|
ret = iso_quick_mbr_entry(t, ((uint64_t) 100) * 4, (uint64_t) 0,
|
||||||
|
0x0c, 0x80, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1128,7 +1315,7 @@ static int iso_write_mbr(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
t->mbr_req[i]->block_count = t->mbr_req[i + 1]->start_block -
|
t->mbr_req[i]->block_count = t->mbr_req[i + 1]->start_block -
|
||||||
t->mbr_req[i]->start_block;
|
t->mbr_req[i]->start_block;
|
||||||
else
|
else
|
||||||
t->mbr_req[i]->block_count = img_blocks -
|
t->mbr_req[i]->block_count = ((uint64_t) img_blocks) * 4 -
|
||||||
t->mbr_req[i]->start_block;
|
t->mbr_req[i]->start_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1165,7 +1352,7 @@ static int iso_write_mbr(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
|||||||
ret = write_mbr_partition_entry(i + 1, (int) t->mbr_req[q]->type_byte,
|
ret = write_mbr_partition_entry(i + 1, (int) t->mbr_req[q]->type_byte,
|
||||||
t->mbr_req[q]->start_block, t->mbr_req[q]->block_count,
|
t->mbr_req[q]->start_block, t->mbr_req[q]->block_count,
|
||||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||||
buf, 0);
|
buf, 2);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
buf[446 + i * 16] = t->mbr_req[q]->status_byte;
|
buf[446 + i * 16] = t->mbr_req[q]->status_byte;
|
||||||
@ -1279,7 +1466,7 @@ int iso_write_gpt_header_block(Ecma119Image *t, uint32_t img_blocks,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* CRC-32 of this header while head_crc is 0 */
|
/* CRC-32 of this header while head_crc is 0 */
|
||||||
crc = iso_crc32_gpt((unsigned char *) buf, 512, 0);
|
crc = iso_crc32_gpt((unsigned char *) buf, 92, 0);
|
||||||
wpt = ((char *) buf) + 16;
|
wpt = ((char *) buf) + 16;
|
||||||
iso_lsb_to_buf(&wpt, crc, 4, 0);
|
iso_lsb_to_buf(&wpt, crc, 4, 0);
|
||||||
|
|
||||||
@ -1398,6 +1585,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
int first_partition = 1, last_partition = 4, apm_flag, part_type;
|
int first_partition = 1, last_partition = 4, apm_flag, part_type;
|
||||||
int gpt_count = 0, gpt_idx[128], apm_count = 0;
|
int gpt_count = 0, gpt_idx[128], apm_count = 0;
|
||||||
uint32_t img_blocks;
|
uint32_t img_blocks;
|
||||||
|
uint64_t blk;
|
||||||
|
uint8_t *wpt;
|
||||||
|
|
||||||
if ((t == NULL) || (buf == NULL)) {
|
if ((t == NULL) || (buf == NULL)) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
@ -1412,7 +1601,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
last_partition = 8;
|
last_partition = 8;
|
||||||
}
|
}
|
||||||
for (i = first_partition - 1; i <= last_partition - 1; i++)
|
for (i = first_partition - 1; i <= last_partition - 1; i++)
|
||||||
if (t->appended_partitions[i] != NULL) {
|
if (t->opts->appended_partitions[i] != NULL) {
|
||||||
will_append = 1;
|
will_append = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1536,16 +1725,22 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
ret = make_sun_disk_label(t, buf, 0);
|
ret = make_sun_disk_label(t, buf, 0);
|
||||||
if (ret != ISO_SUCCESS)
|
if (ret != ISO_SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
} else if ((t->partition_offset > 0 || will_append) && sa_type == 0 &&
|
} else if (sa_type == 4 || sa_type == 5) {
|
||||||
t->mbr_req_count == 0) {
|
/* (By coincidence, sa_type and PALO header versions match) */
|
||||||
|
ret = make_hppa_palo_sector(t, buf, sa_type, 0);
|
||||||
|
if (ret != ISO_SUCCESS)
|
||||||
|
return ret;
|
||||||
|
} else if ((t->opts->partition_offset > 0 || will_append) &&
|
||||||
|
sa_type == 0 && t->mbr_req_count == 0) {
|
||||||
/* Write a simple partition table. */
|
/* Write a simple partition table. */
|
||||||
ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head,
|
ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head,
|
||||||
t->partition_heads_per_cyl, buf, 2);
|
t->partition_heads_per_cyl, buf, 2);
|
||||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||||
return ISO_ASSERT_FAILURE;
|
return ISO_ASSERT_FAILURE;
|
||||||
if (t->partition_offset == 0) {
|
if (t->opts->partition_offset == 0) {
|
||||||
/* Re-write partion entry 1 : start at 0, type Linux */
|
/* Re-write partion entry 1 : start at 0, type Linux */
|
||||||
ret = write_mbr_partition_entry(1, 0x83, 0, img_blocks,
|
ret = write_mbr_partition_entry(1, 0x83,
|
||||||
|
(uint64_t) 0, (uint64_t) img_blocks,
|
||||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||||
buf, 0);
|
buf, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -1553,14 +1748,15 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->partition_offset > 0 && sa_type == 0 && t->mbr_req_count == 0) {
|
if (t->opts->partition_offset > 0 && sa_type == 0 &&
|
||||||
|
t->mbr_req_count == 0) {
|
||||||
/* Adjust partition table to partition offset.
|
/* Adjust partition table to partition offset.
|
||||||
With t->mbr_req_count > 0 this has already been done,
|
With t->mbr_req_count > 0 this has already been done,
|
||||||
*/
|
*/
|
||||||
img_blocks = t->curblock; /* value might be altered */
|
img_blocks = t->curblock; /* value might be altered */
|
||||||
ret = iso_offset_partition_start(img_blocks, t->partition_offset,
|
ret = iso_offset_partition_start(img_blocks, t->opts->partition_offset,
|
||||||
t->partition_secs_per_head,
|
t->partition_secs_per_head,
|
||||||
t->partition_heads_per_cyl, buf, 1);
|
t->partition_heads_per_cyl, buf, 0);
|
||||||
if (ret != ISO_SUCCESS) /* error should never happen */
|
if (ret != ISO_SUCCESS) /* error should never happen */
|
||||||
return ISO_ASSERT_FAILURE;
|
return ISO_ASSERT_FAILURE;
|
||||||
}
|
}
|
||||||
@ -1569,18 +1765,21 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
made so far. Overwriting those from t->mbr_req is not allowed.
|
made so far. Overwriting those from t->mbr_req is not allowed.
|
||||||
*/
|
*/
|
||||||
for (i = first_partition - 1; i <= last_partition - 1; i++) {
|
for (i = first_partition - 1; i <= last_partition - 1; i++) {
|
||||||
if (t->appended_partitions[i] == NULL)
|
if (t->opts->appended_partitions[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (i < t->mbr_req_count)
|
if (i < t->mbr_req_count)
|
||||||
return ISO_BOOT_MBR_COLLISION;
|
return ISO_BOOT_MBR_COLLISION;
|
||||||
if (sa_type == 3) {
|
if (sa_type == 3) {
|
||||||
ret = write_sun_partition_entry(i + 1, t->appended_partitions,
|
ret = write_sun_partition_entry(i + 1,
|
||||||
|
t->opts->appended_partitions,
|
||||||
t->appended_part_start, t->appended_part_size,
|
t->appended_part_start, t->appended_part_size,
|
||||||
ISO_SUN_CYL_SIZE,
|
ISO_SUN_CYL_SIZE,
|
||||||
buf, t->appended_partitions[i][0] == 0);
|
buf, t->opts->appended_partitions[i][0] == 0);
|
||||||
} else {
|
} else {
|
||||||
ret = write_mbr_partition_entry(i + 1, t->appended_part_types[i],
|
ret = write_mbr_partition_entry(i + 1,
|
||||||
t->appended_part_start[i], t->appended_part_size[i],
|
t->opts->appended_part_types[i],
|
||||||
|
(uint64_t) t->appended_part_start[i],
|
||||||
|
(uint64_t) t->appended_part_size[i],
|
||||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||||
buf, 0);
|
buf, 0);
|
||||||
}
|
}
|
||||||
@ -1588,6 +1787,15 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sa_type == 0 && (t->system_area_options & 0x4000) && !do_isohybrid) {
|
||||||
|
/* Patch MBR for GRUB2 */
|
||||||
|
blk = t->bootsrc[0]->sections[0].block * 4 +
|
||||||
|
Libisofs_grub2_mbr_patch_offsT;
|
||||||
|
wpt = buf + Libisofs_grub2_mbr_patch_poS;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
wpt[i] = blk >> (i * 8);
|
||||||
|
}
|
||||||
|
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1638,7 +1846,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
img_blocks = t->curblock + t->tail_blocks + t->gpt_backup_size;
|
img_blocks = t->curblock + t->opts->tail_blocks + t->gpt_backup_size;
|
||||||
imgsize = ((off_t) img_blocks) * (off_t) 2048;
|
imgsize = ((off_t) img_blocks) * (off_t) 2048;
|
||||||
if (((t->system_area_options & 3) || always_align)
|
if (((t->system_area_options & 3) || always_align)
|
||||||
&& (off_t) (t->partition_heads_per_cyl * t->partition_secs_per_head
|
&& (off_t) (t->partition_heads_per_cyl * t->partition_secs_per_head
|
||||||
@ -1663,7 +1871,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
iso_msgs_submit(0, msg, 0, "NOTE", 0);
|
iso_msgs_submit(0, msg, 0, "NOTE", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (always_align >= 2)
|
if (always_align == 2)
|
||||||
{ret = ISO_SUCCESS; goto ex;}
|
{ret = ISO_SUCCESS; goto ex;}
|
||||||
|
|
||||||
cylsize = 0;
|
cylsize = 0;
|
||||||
@ -1714,7 +1922,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
(int) cylsize);
|
(int) cylsize);
|
||||||
iso_msgs_submit(0, msg, 0, "WARNING", 0);
|
iso_msgs_submit(0, msg, 0, "WARNING", 0);
|
||||||
} else {
|
} else {
|
||||||
t->tail_blocks += frac / 2048;
|
t->opts->tail_blocks += frac / 2048;
|
||||||
}
|
}
|
||||||
ret = ISO_SUCCESS;
|
ret = ISO_SUCCESS;
|
||||||
ex:;
|
ex:;
|
||||||
@ -1834,12 +2042,13 @@ void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16])
|
|||||||
0xee, 0x29, 0x9d, 0xfc, 0x65, 0xcc, 0x7c, 0x40,
|
0xee, 0x29, 0x9d, 0xfc, 0x65, 0xcc, 0x7c, 0x40,
|
||||||
0x92, 0x61, 0x5b, 0xcd, 0x6f, 0xed, 0x08, 0x34
|
0x92, 0x61, 0x5b, 0xcd, 0x6f, 0xed, 0x08, 0x34
|
||||||
};
|
};
|
||||||
|
static uint8_t uuid_urandom[16];
|
||||||
uint32_t rnd, salt;
|
uint32_t rnd, salt;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct timezone tz;
|
struct timezone tz;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
static int counter = 0;
|
static int counter = 0, use_urandom = 0;
|
||||||
int i;
|
int i, ret, fd;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Libisofs_with_uuid_generatE
|
#ifdef Libisofs_with_uuid_generatE
|
||||||
@ -1850,6 +2059,32 @@ void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16])
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
/* First try /dev/urandom.
|
||||||
|
(Weakening the result by 8 bit saves a lot of pool entropy.)
|
||||||
|
*/
|
||||||
|
if ((counter & 0xff) == 0) {
|
||||||
|
fd = open("/dev/urandom", O_RDONLY);
|
||||||
|
if (fd == -1)
|
||||||
|
goto fallback;
|
||||||
|
ret = read(fd, uuid_urandom, 16);
|
||||||
|
if (ret != 16) {
|
||||||
|
close(fd);
|
||||||
|
goto fallback;
|
||||||
|
}
|
||||||
|
/* Mark as UUID version 4 */
|
||||||
|
uuid_urandom[7] = (uuid_urandom[7] & 0x0f) | 0x40;
|
||||||
|
uuid_urandom[8] = (uuid_urandom[8] & 0x3f) | 0x80;
|
||||||
|
close(fd);
|
||||||
|
use_urandom = 1;
|
||||||
|
}
|
||||||
|
if (!use_urandom)
|
||||||
|
goto fallback;
|
||||||
|
memcpy(uuid, uuid_urandom, 16);
|
||||||
|
uuid[9] ^= counter & 0xff;
|
||||||
|
counter++;
|
||||||
|
return;
|
||||||
|
|
||||||
|
fallback:;
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
salt = iso_crc32_gpt((unsigned char *) t, sizeof(Ecma119Image), 0) ^ pid;
|
salt = iso_crc32_gpt((unsigned char *) t, sizeof(Ecma119Image), 0) ^ pid;
|
||||||
|
|
||||||
@ -1865,7 +2100,7 @@ void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16])
|
|||||||
u[i] = (salt >> (8 * i)) & 0xff;
|
u[i] = (salt >> (8 * i)) & 0xff;
|
||||||
for (i = 0; i < 2; i++)
|
for (i = 0; i < 2; i++)
|
||||||
u[4 + i] = (pid >> (8 * i)) & 0xff;
|
u[4 + i] = (pid >> (8 * i)) & 0xff;
|
||||||
u[6] = ((salt >> 8) | (pid >> 16)) & 0xff;
|
u[6] = ((salt >> 8) ^ (pid >> 16)) & 0xff;
|
||||||
rnd = ((0xffffff & tv.tv_sec) << 8) |
|
rnd = ((0xffffff & tv.tv_sec) << 8) |
|
||||||
(((tv.tv_usec >> 16) ^ (salt & 0xf0)) & 0xff);
|
(((tv.tv_usec >> 16) ^ (salt & 0xf0)) & 0xff);
|
||||||
u[9] ^= counter & 0xff;
|
u[9] ^= counter & 0xff;
|
||||||
@ -1882,21 +2117,6 @@ void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void iso_random_8byte(Ecma119Image *t, uint8_t result[8])
|
|
||||||
{
|
|
||||||
uint8_t uuid[16];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
iso_random_uuid(t, uuid);
|
|
||||||
for (i = 0; i < 8; i++) {
|
|
||||||
if (i == 1)
|
|
||||||
result[i] = uuid[9]; /* The intra-process counter */
|
|
||||||
else
|
|
||||||
result[i] = uuid[i] ^ uuid[i + 8];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Probably already called by tail_writer_compute_data_blocks via
|
/* Probably already called by tail_writer_compute_data_blocks via
|
||||||
iso_align_isohybrid
|
iso_align_isohybrid
|
||||||
*/
|
*/
|
||||||
@ -1994,8 +2214,12 @@ static int precompute_gpt(Ecma119Image *t)
|
|||||||
|
|
||||||
/* Determine GPT partition start in System Area, */
|
/* Determine GPT partition start in System Area, */
|
||||||
gpt_part_start = 0;
|
gpt_part_start = 0;
|
||||||
if (t->apm_req_count > 0)
|
if (t->apm_req_count > 0) {
|
||||||
gpt_part_start = (t->apm_req_count + 1) * (t->apm_block_size / 512);
|
if (t->opts->apm_block_size == 0)
|
||||||
|
t->opts->apm_block_size = 2048;
|
||||||
|
gpt_part_start = (t->apm_req_count + 1) *
|
||||||
|
(t->opts->apm_block_size / 512);
|
||||||
|
}
|
||||||
if (gpt_part_start < 2)
|
if (gpt_part_start < 2)
|
||||||
gpt_part_start = 2;
|
gpt_part_start = 2;
|
||||||
else if (gpt_part_start >= 64)
|
else if (gpt_part_start >= 64)
|
||||||
@ -2084,7 +2308,7 @@ tampered_head:;
|
|||||||
|
|
||||||
/* Compute new header CRC */
|
/* Compute new header CRC */
|
||||||
memset(new_head + 16, 0, 4);
|
memset(new_head + 16, 0, 4);
|
||||||
crc = iso_crc32_gpt((unsigned char *) new_head, 512, 0);
|
crc = iso_crc32_gpt((unsigned char *) new_head, 92, 0);
|
||||||
iso_lsb(new_head + 16, crc, 4);
|
iso_lsb(new_head + 16, crc, 4);
|
||||||
|
|
||||||
/* Copy GPT entries */
|
/* Copy GPT entries */
|
||||||
@ -2158,11 +2382,12 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t = writer->target;
|
t = writer->target;
|
||||||
|
|
||||||
with_chrp = ((t->system_area_options & 0x3cff) == 0x0400);
|
with_chrp = ((t->system_area_options & 0x3cff) == 0x0400);
|
||||||
if (t->efi_boot_partition != NULL || (t->hfsplus && !with_chrp) ||
|
if (t->opts->efi_boot_partition != NULL ||
|
||||||
|
(t->opts->hfsplus && !with_chrp) ||
|
||||||
t->gpt_req_count > 0)
|
t->gpt_req_count > 0)
|
||||||
will_have_gpt = 1;
|
will_have_gpt = 1;
|
||||||
|
|
||||||
if (t->efi_boot_partition != NULL) {
|
if (t->opts->efi_boot_partition != NULL) {
|
||||||
if (t->efi_boot_part_filesrc != NULL) {
|
if (t->efi_boot_part_filesrc != NULL) {
|
||||||
/* A file in the emerging ISO image shall store its content
|
/* A file in the emerging ISO image shall store its content
|
||||||
as prepended partition.
|
as prepended partition.
|
||||||
@ -2175,7 +2400,7 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
t->efi_boot_part_size += (src->sections[i].size + 2047) / 2048;
|
t->efi_boot_part_size += (src->sections[i].size + 2047) / 2048;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = compute_partition_size(t->efi_boot_partition,
|
ret = compute_partition_size(t->opts->efi_boot_partition,
|
||||||
&(t->efi_boot_part_size), 0);
|
&(t->efi_boot_part_size), 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -2192,40 +2417,44 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
|
|
||||||
if (with_chrp) {
|
if (with_chrp) {
|
||||||
/* CHRP is not compatible with any other partition in MBR */
|
/* CHRP is not compatible with any other partition in MBR */
|
||||||
if (t->prep_partition != NULL || t->fat || will_have_gpt ||
|
if (t->opts->prep_partition != NULL || t->opts->fat || will_have_gpt ||
|
||||||
t->mbr_req_count > 0)
|
t->mbr_req_count > 0)
|
||||||
return ISO_BOOT_MBR_OVERLAP;
|
return ISO_BOOT_MBR_OVERLAP;
|
||||||
ret = iso_quick_mbr_entry(t, (uint32_t) 0, (uint32_t) 0,
|
ret = iso_quick_mbr_entry(t, (uint64_t) 0, (uint64_t) 0,
|
||||||
0x96, 0x80, 0);
|
0x96, 0x80, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t->prep_partition != NULL) {
|
if (t->opts->prep_partition != NULL) {
|
||||||
ret = compute_partition_size(t->prep_partition, &(t->prep_part_size),
|
ret = compute_partition_size(t->opts->prep_partition,
|
||||||
0);
|
&(t->prep_part_size), 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (t->prep_part_size > 0 || t->fat || will_have_gpt) {
|
if (t->prep_part_size > 0 || t->opts->fat || will_have_gpt) {
|
||||||
/* Protecting MBR entry for ISO start or whole ISO */
|
/* Protecting MBR entry for ISO start or whole ISO */
|
||||||
ret = iso_quick_mbr_entry(t, (uint32_t) t->partition_offset,
|
ret = iso_quick_mbr_entry(t, will_have_gpt ? (uint64_t) 1 :
|
||||||
(uint32_t) 0, will_have_gpt ? 0xee : 0xcd, 0, 0);
|
((uint64_t) t->opts->partition_offset) * 4,
|
||||||
|
(uint64_t) 0,
|
||||||
|
will_have_gpt ? 0xee : 0xcd, 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (t->prep_part_size > 0) {
|
if (t->prep_part_size > 0) {
|
||||||
ret = iso_quick_mbr_entry(t, t->curblock, t->prep_part_size, 0x41,
|
ret = iso_quick_mbr_entry(t, ((uint64_t) t->curblock) * 4,
|
||||||
0, 0);
|
((uint64_t) t->prep_part_size) * 4,
|
||||||
|
0x41, 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
t->curblock += t->prep_part_size;
|
t->curblock += t->prep_part_size;
|
||||||
}
|
}
|
||||||
if (t->prep_part_size > 0 || t->fat) {
|
if (t->prep_part_size > 0 || t->opts->fat) {
|
||||||
/* FAT partition or protecting MBR entry for ISO end */
|
/* FAT partition or protecting MBR entry for ISO end */
|
||||||
ret = iso_quick_mbr_entry(t, (uint32_t) t->curblock, (uint32_t) 0,
|
ret = iso_quick_mbr_entry(t, ((uint64_t) t->curblock) * 4,
|
||||||
t->fat ? 0x0c : 0xcd, 0, 0);
|
(uint64_t) 0,
|
||||||
|
t->opts->fat ? 0x0c : 0xcd, 0, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2247,21 +2476,21 @@ static int partprepend_writer_write_data(IsoImageWriter *writer)
|
|||||||
|
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
|
|
||||||
if (t->efi_boot_partition != NULL && t->efi_boot_part_size) {
|
if (t->opts->efi_boot_partition != NULL && t->efi_boot_part_size) {
|
||||||
|
|
||||||
if (t->efi_boot_part_filesrc != NULL) {
|
if (t->efi_boot_part_filesrc != NULL) {
|
||||||
ret = iso_filesrc_write_data(t, t->efi_boot_part_filesrc,
|
ret = iso_filesrc_write_data(t, t->efi_boot_part_filesrc,
|
||||||
NULL, NULL, 0);
|
NULL, NULL, 0);
|
||||||
} else {
|
} else {
|
||||||
ret = iso_write_partition_file(t, t->efi_boot_partition,
|
ret = iso_write_partition_file(t, t->opts->efi_boot_partition,
|
||||||
(uint32_t) 0, t->efi_boot_part_size, 0);
|
(uint32_t) 0, t->efi_boot_part_size, 0);
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (t->prep_partition != NULL && t->prep_part_size) {
|
if (t->opts->prep_partition != NULL && t->prep_part_size) {
|
||||||
ret = iso_write_partition_file(t, t->prep_partition, (uint32_t) 0,
|
ret = iso_write_partition_file(t, t->opts->prep_partition,
|
||||||
t->prep_part_size, 0);
|
(uint32_t) 0, t->prep_part_size, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -78,13 +78,13 @@ int iso_compute_append_partitions(Ecma119Image *t, int flag);
|
|||||||
*/
|
*/
|
||||||
struct iso_mbr_partition_request {
|
struct iso_mbr_partition_request {
|
||||||
|
|
||||||
/* Always given in blocks of 2 KiB */
|
/* Always given in blocks of 512 bytes */
|
||||||
uint32_t start_block;
|
uint64_t start_block;
|
||||||
|
|
||||||
/* A block count of 0 means that the partition reaches up to the start of
|
/* A block count of 0 means that the partition reaches up to the start of
|
||||||
the next one.
|
the next one.
|
||||||
*/
|
*/
|
||||||
uint32_t block_count;
|
uint64_t block_count;
|
||||||
|
|
||||||
/* Partition type */
|
/* Partition type */
|
||||||
uint8_t type_byte;
|
uint8_t type_byte;
|
||||||
@ -115,7 +115,7 @@ int iso_register_mbr_entry(Ecma119Image *t,
|
|||||||
name and type are 0-terminated strings, which may get silently truncated.
|
name and type are 0-terminated strings, which may get silently truncated.
|
||||||
*/
|
*/
|
||||||
int iso_quick_mbr_entry(Ecma119Image *t,
|
int iso_quick_mbr_entry(Ecma119Image *t,
|
||||||
uint32_t start_block, uint32_t block_count,
|
uint64_t start_block, uint64_t block_count,
|
||||||
uint8_t type_byte, uint8_t status_byte,
|
uint8_t type_byte, uint8_t status_byte,
|
||||||
int desired_slot);
|
int desired_slot);
|
||||||
|
|
||||||
@ -186,10 +186,6 @@ unsigned int iso_crc32_gpt(unsigned char *data, int count, int flag);
|
|||||||
*/
|
*/
|
||||||
void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16]);
|
void iso_random_uuid(Ecma119Image *t, uint8_t uuid[16]);
|
||||||
|
|
||||||
/* Produces a weakly random variation of a hardcoded real random template
|
|
||||||
*/
|
|
||||||
void iso_random_8byte(Ecma119Image *t, uint8_t result[8]);
|
|
||||||
|
|
||||||
|
|
||||||
/* The parameter struct for production of a single GPT entry.
|
/* The parameter struct for production of a single GPT entry.
|
||||||
See also the partial GPT description in doc/boot_sectors.txt.
|
See also the partial GPT description in doc/boot_sectors.txt.
|
||||||
@ -270,4 +266,17 @@ int gpt_tail_writer_create(Ecma119Image *target);
|
|||||||
/* Only for up to 36 characters ISO-8859-1 (or ASCII) input */
|
/* Only for up to 36 characters ISO-8859-1 (or ASCII) input */
|
||||||
void iso_ascii_utf_16le(uint8_t gap_name[72]);
|
void iso_ascii_utf_16le(uint8_t gap_name[72]);
|
||||||
|
|
||||||
|
|
||||||
|
/* Parameters of MBR patching for GRUB2
|
||||||
|
Might later become variables in Ecma119Image
|
||||||
|
*/
|
||||||
|
#define Libisofs_grub2_mbr_patch_poS 0x1b0
|
||||||
|
#define Libisofs_grub2_mbr_patch_offsT 4
|
||||||
|
|
||||||
|
/* Parameters of SUN Disk Label patching for GRUB2
|
||||||
|
See API iso_image_set_sparc_core().
|
||||||
|
*/
|
||||||
|
#define Libisofs_grub2_sparc_patch_adr_poS 0x228
|
||||||
|
#define Libisofs_grub2_sparc_patch_size_poS 0x230
|
||||||
|
|
||||||
#endif /* SYSTEM_AREA_H_ */
|
#endif /* SYSTEM_AREA_H_ */
|
||||||
|
261
libisofs/tree.c
261
libisofs/tree.c
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2011 Thomas Schmitt
|
* Copyright (c) 2011 - 2014 Thomas Schmitt
|
||||||
*
|
*
|
||||||
* This file is part of the libisofs project; you can redistribute it and/or
|
* 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
|
* modify it under the terms of the GNU General Public License version 2
|
||||||
@ -23,6 +23,7 @@
|
|||||||
#include "builder.h"
|
#include "builder.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -502,10 +503,10 @@ int iso_tree_add_node_builder(IsoImage *image, IsoDir *parent,
|
|||||||
int result;
|
int result;
|
||||||
IsoNode *new;
|
IsoNode *new;
|
||||||
IsoNode **pos;
|
IsoNode **pos;
|
||||||
char *name;
|
char *name = NULL;
|
||||||
|
|
||||||
if (parent == NULL || src == NULL || builder == NULL) {
|
if (parent == NULL || src == NULL || builder == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
result = ISO_NULL_POINTER; goto ex;
|
||||||
}
|
}
|
||||||
if (node) {
|
if (node) {
|
||||||
*node = NULL;
|
*node = NULL;
|
||||||
@ -515,23 +516,25 @@ int iso_tree_add_node_builder(IsoImage *image, IsoDir *parent,
|
|||||||
|
|
||||||
/* find place where to insert */
|
/* find place where to insert */
|
||||||
result = iso_dir_exists(parent, name, &pos);
|
result = iso_dir_exists(parent, name, &pos);
|
||||||
free(name);
|
|
||||||
if (result) {
|
if (result) {
|
||||||
/* a node with same name already exists */
|
/* a node with same name already exists */
|
||||||
return ISO_NODE_NAME_NOT_UNIQUE;
|
result = ISO_NODE_NAME_NOT_UNIQUE; goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = builder->create_node(builder, image, src, &new);
|
result = builder->create_node(builder, image, src, name, &new);
|
||||||
if (result < 0) {
|
if (result < 0)
|
||||||
return result;
|
goto ex;
|
||||||
}
|
|
||||||
|
|
||||||
if (node) {
|
if (node) {
|
||||||
*node = new;
|
*node = new;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finally, add node to parent */
|
/* finally, add node to parent */
|
||||||
return iso_dir_insert(parent, (IsoNode*)new, pos, ISO_REPLACE_NEVER);
|
result = iso_dir_insert(parent, (IsoNode*)new, pos, ISO_REPLACE_NEVER);
|
||||||
|
ex:
|
||||||
|
if (name != NULL)
|
||||||
|
free(name);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iso_tree_add_node(IsoImage *image, IsoDir *parent, const char *path,
|
int iso_tree_add_node(IsoImage *image, IsoDir *parent, const char *path,
|
||||||
@ -587,7 +590,8 @@ int iso_tree_add_new_node(IsoImage *image, IsoDir *parent, const char *name,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = image->builder->create_node(image->builder, image, file, &new);
|
result = image->builder->create_node(image->builder, image, file,
|
||||||
|
(char *) name, &new);
|
||||||
|
|
||||||
/* free the file */
|
/* free the file */
|
||||||
iso_file_source_unref(file);
|
iso_file_source_unref(file);
|
||||||
@ -596,12 +600,6 @@ int iso_tree_add_new_node(IsoImage *image, IsoDir *parent, const char *name,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = iso_node_set_name(new, name);
|
|
||||||
if (result < 0) {
|
|
||||||
iso_node_unref(new);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node) {
|
if (node) {
|
||||||
*node = new;
|
*node = new;
|
||||||
}
|
}
|
||||||
@ -742,6 +740,176 @@ int check_special(IsoImage *image, mode_t mode)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void ascii_increment(char *name, int len, int pos, int rollover_carry)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
again:;
|
||||||
|
if (pos < 0 || pos >= len)
|
||||||
|
pos = len - 1;
|
||||||
|
c = name[pos];
|
||||||
|
if (c >= '0' && c < '9') {
|
||||||
|
c++;
|
||||||
|
} else if (c == '9') {
|
||||||
|
c = 'A';
|
||||||
|
} else if (c >= 'A' && c < 'Z') {
|
||||||
|
c++;
|
||||||
|
} else if (c == 'Z') {
|
||||||
|
c = '_';
|
||||||
|
} else if (c == '_') {
|
||||||
|
c = 'a';
|
||||||
|
} else if (c >= 'a' && c < 'z') {
|
||||||
|
c++;
|
||||||
|
} else if (c == 'z') {
|
||||||
|
c = '0';
|
||||||
|
name[pos] = c;
|
||||||
|
pos--;
|
||||||
|
if (pos >= 0 || rollover_carry)
|
||||||
|
goto again;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (pos == len - 1 || name[pos + 1] == '.')
|
||||||
|
c = '_'; /* Make first change less riddling */
|
||||||
|
else
|
||||||
|
c = '0'; /* But else use the full range of valid characters */
|
||||||
|
}
|
||||||
|
name[pos] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int insert_underscores(char *name, int *len, int *at_pos, int count,
|
||||||
|
char **new_name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
LIBISO_ALLOC_MEM(*new_name, char, count + *len + 1);
|
||||||
|
if (*at_pos > 0)
|
||||||
|
memcpy(*new_name, name, *at_pos);
|
||||||
|
if (count > 0)
|
||||||
|
memset(*new_name + *at_pos, '_', count);
|
||||||
|
if (*len > *at_pos)
|
||||||
|
memcpy(*new_name + *at_pos + count, name + *at_pos, *len - *at_pos);
|
||||||
|
(*new_name)[count + *len] = 0;
|
||||||
|
*len += count;
|
||||||
|
*at_pos += count;
|
||||||
|
ret= ISO_SUCCESS;
|
||||||
|
ex:;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int make_incrementable_name(char **name, char **unique_name, int *low_pos,
|
||||||
|
int *rollover_carry, int *pre_check)
|
||||||
|
{
|
||||||
|
char *dpt, *npt;
|
||||||
|
int first, len, ret;
|
||||||
|
|
||||||
|
/* The incrementable part of the file shall have at least 7 characters.
|
||||||
|
There may be up to pow(2.0,32.0)*2048/33 = 266548273400 files.
|
||||||
|
The set of increment result characters has 63 elements.
|
||||||
|
pow(63.0,7.0) is nearly 15 times larger than 266548273400.
|
||||||
|
*/
|
||||||
|
static int min_incr = 7;
|
||||||
|
|
||||||
|
/* At most two suffixes of total length up to 12, like .tar.bz2,
|
||||||
|
shall be preserved. The incrementable part will eventually be
|
||||||
|
padded up.
|
||||||
|
Incrementing begins before the last suffix in any case. But when this
|
||||||
|
rolls over on short prefixes, then long last suffixes will get used
|
||||||
|
as high characters of the incremental part. This is indicated by
|
||||||
|
*rollover_carry which corresponds to the parameter of ascii_increment()
|
||||||
|
with the same name.
|
||||||
|
*/
|
||||||
|
static int max_suffix = 12;
|
||||||
|
|
||||||
|
*rollover_carry = 0;
|
||||||
|
*pre_check = 0;
|
||||||
|
|
||||||
|
len = strlen(*name);
|
||||||
|
|
||||||
|
/* Check if the part before the first dot is long enough.
|
||||||
|
If not, then preserve the last two short suffixes.
|
||||||
|
*/
|
||||||
|
dpt = strchr(*name, '.');
|
||||||
|
if (dpt != NULL)
|
||||||
|
if ((dpt - *name) < min_incr)
|
||||||
|
dpt = strrchr(*name, '.');
|
||||||
|
if (dpt != NULL) {
|
||||||
|
first= (dpt - *name);
|
||||||
|
if (dpt > *name && len - first < max_suffix) {
|
||||||
|
for(npt = dpt - 1; npt >= *name && *npt != '.'; npt--);
|
||||||
|
if (npt >= *name) {
|
||||||
|
if (len - (npt - *name) <= max_suffix) {
|
||||||
|
first= (npt - *name);
|
||||||
|
dpt = npt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
first= len;
|
||||||
|
if (first < min_incr && (len - first) <= max_suffix) {
|
||||||
|
ret = insert_underscores(*name, &len, &first, min_incr - first,
|
||||||
|
unique_name);
|
||||||
|
if (ret < 0)
|
||||||
|
goto ex;
|
||||||
|
*pre_check = 1; /* It might now already be unique */
|
||||||
|
|
||||||
|
} else if (len < 64) {
|
||||||
|
/* Insert an underscore to preserve the original name at least for the
|
||||||
|
first few increments
|
||||||
|
*/
|
||||||
|
ret = insert_underscores(*name, &len, &first, 1, unique_name);
|
||||||
|
if (ret < 0)
|
||||||
|
goto ex;
|
||||||
|
*pre_check = 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
LIBISO_ALLOC_MEM(*unique_name, char, len + 1);
|
||||||
|
memcpy(*unique_name, *name, len);
|
||||||
|
if (first < min_incr)
|
||||||
|
*rollover_carry = 1; /* Do not get caged before the dots */
|
||||||
|
}
|
||||||
|
(*unique_name)[len] = 0;
|
||||||
|
*low_pos = first - 1;
|
||||||
|
ret = 1;
|
||||||
|
ex:;
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int make_really_unique_name(IsoDir *parent, char **name, char **unique_name,
|
||||||
|
IsoNode ***pos, int flag)
|
||||||
|
{
|
||||||
|
int ret, rollover_carry = 0, pre_check = 0, ascii_idx = -1, len;
|
||||||
|
|
||||||
|
ret = make_incrementable_name(name, unique_name, &ascii_idx,
|
||||||
|
&rollover_carry, &pre_check);
|
||||||
|
if (ret < 0)
|
||||||
|
goto ex;
|
||||||
|
len = strlen(*unique_name);
|
||||||
|
while (1) {
|
||||||
|
if (!pre_check)
|
||||||
|
ascii_increment(*unique_name, len, ascii_idx, !!rollover_carry);
|
||||||
|
else
|
||||||
|
pre_check = 0;
|
||||||
|
ret = iso_dir_exists(parent, *unique_name, pos);
|
||||||
|
if (ret < 0)
|
||||||
|
goto ex;
|
||||||
|
if (ret == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*name = *unique_name;
|
||||||
|
ret = ISO_SUCCESS;
|
||||||
|
ex:;
|
||||||
|
if (ret < 0) {
|
||||||
|
LIBISO_FREE_MEM(*unique_name);
|
||||||
|
*unique_name = NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively add a given directory to the image tree.
|
* Recursively add a given directory to the image tree.
|
||||||
*
|
*
|
||||||
@ -750,12 +918,12 @@ int check_special(IsoImage *image, mode_t mode)
|
|||||||
*/
|
*/
|
||||||
int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, dir_is_open = 0;
|
||||||
IsoNodeBuilder *builder;
|
IsoNodeBuilder *builder;
|
||||||
IsoFileSource *file;
|
IsoFileSource *file;
|
||||||
IsoNode **pos;
|
IsoNode **pos;
|
||||||
struct stat info;
|
struct stat info;
|
||||||
char *name, *path;
|
char *name, *path, *allocated_name = NULL;
|
||||||
IsoNode *new;
|
IsoNode *new;
|
||||||
enum iso_replace_mode replace;
|
enum iso_replace_mode replace;
|
||||||
|
|
||||||
@ -771,8 +939,9 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
|||||||
ret = iso_msg_submit(image->id, ISO_NULL_POINTER, ret,
|
ret = iso_msg_submit(image->id, ISO_NULL_POINTER, ret,
|
||||||
"Can't open dir. NULL pointer caught as dir name");
|
"Can't open dir. NULL pointer caught as dir name");
|
||||||
}
|
}
|
||||||
return ret;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
dir_is_open = 1;
|
||||||
|
|
||||||
builder = image->builder;
|
builder = image->builder;
|
||||||
|
|
||||||
@ -785,15 +954,16 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/* error reading dir */
|
/* error reading dir */
|
||||||
ret = iso_msg_submit(image->id, ret, ret, "Error reading dir");
|
ret = iso_msg_submit(image->id, ret, ret, "Error reading dir");
|
||||||
|
goto ex;
|
||||||
}
|
}
|
||||||
break;
|
break; /* End of directory */
|
||||||
}
|
}
|
||||||
|
|
||||||
path = iso_file_source_get_path(file);
|
path = iso_file_source_get_path(file);
|
||||||
if (path == NULL) {
|
if (path == NULL) {
|
||||||
ret = iso_msg_submit(image->id, ISO_NULL_POINTER, ret,
|
ret = iso_msg_submit(image->id, ISO_NULL_POINTER, ret,
|
||||||
"NULL pointer caught as file path");
|
"NULL pointer caught as file path");
|
||||||
return ret;
|
goto ex;
|
||||||
}
|
}
|
||||||
name = strrchr(path, '/') + 1;
|
name = strrchr(path, '/') + 1;
|
||||||
|
|
||||||
@ -803,6 +973,8 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
|||||||
ret = iso_file_source_lstat(file, &info);
|
ret = iso_file_source_lstat(file, &info);
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
ret = iso_msg_submit(image->id, ISO_FILE_CANT_ADD, ret,
|
||||||
|
"Error when adding file %s", path);
|
||||||
goto dir_rec_continue;
|
goto dir_rec_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,19 +997,25 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
|||||||
|
|
||||||
/* find place where to insert */
|
/* find place where to insert */
|
||||||
ret = iso_dir_exists(parent, name, &pos);
|
ret = iso_dir_exists(parent, name, &pos);
|
||||||
/* TODO
|
if (ret) {
|
||||||
* if (ret && replace == ISO_REPLACE_ASK) {
|
/* Resolve name collision
|
||||||
* replace = /....
|
e.g. caused by fs_image.c:make_hopefully_unique_name()
|
||||||
* }
|
*/
|
||||||
*/
|
LIBISO_FREE_MEM(allocated_name); allocated_name = NULL;
|
||||||
|
ret = make_really_unique_name(parent, &name, &allocated_name, &pos,
|
||||||
/* chek if we must insert or not */
|
0);
|
||||||
/* TODO check for other replace behavior */
|
if (ret < 0)
|
||||||
if (ret && (replace == ISO_REPLACE_NEVER)) {
|
goto ex;
|
||||||
/* skip file */
|
image->collision_warnings++;
|
||||||
goto dir_rec_continue;
|
if (image->collision_warnings < ISO_IMPORT_COLL_WARN_MAX) {
|
||||||
|
ret = iso_msg_submit(image->id, ISO_IMPORT_COLLISION, 0,
|
||||||
|
"File name collision resolved with %s . Now: %s",
|
||||||
|
path, name);
|
||||||
|
if (ret < 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we are here we must insert. Give user a chance for cancel */
|
/* if we are here we must insert. Give user a chance for cancel */
|
||||||
if (image->report) {
|
if (image->report) {
|
||||||
int r = image->report(image, file);
|
int r = image->report(image, file);
|
||||||
@ -846,7 +1024,7 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
|||||||
goto dir_rec_continue;
|
goto dir_rec_continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = builder->create_node(builder, image, file, &new);
|
ret = builder->create_node(builder, image, file, name, &new);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = iso_msg_submit(image->id, ISO_FILE_CANT_ADD, ret,
|
ret = iso_msg_submit(image->id, ISO_FILE_CANT_ADD, ret,
|
||||||
"Error when adding file %s", path);
|
"Error when adding file %s", path);
|
||||||
@ -882,14 +1060,17 @@ dir_rec_continue:;
|
|||||||
/* check for error severity to decide what to do */
|
/* check for error severity to decide what to do */
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = iso_msg_submit(image->id, ret, 0, NULL);
|
ret = iso_msg_submit(image->id, ret, 0, NULL);
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
break;
|
goto ex;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} /* while */
|
} /* while */
|
||||||
|
|
||||||
iso_file_source_close(dir);
|
ret = ISO_SUCCESS;
|
||||||
return ret < 0 ? ret : ISO_SUCCESS;
|
ex:;
|
||||||
|
if (dir_is_open)
|
||||||
|
iso_file_source_close(dir);
|
||||||
|
LIBISO_FREE_MEM(allocated_name);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iso_tree_add_dir_rec(IsoImage *image, IsoDir *parent, const char *dir)
|
int iso_tree_add_dir_rec(IsoImage *image, IsoDir *parent, const char *dir)
|
||||||
|
180
libisofs/util.c
180
libisofs/util.c
@ -241,8 +241,8 @@ ex:;
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
int strnconvl(const char *str, const char *icharset, const char *ocharset,
|
||||||
size_t len, char **output)
|
size_t len, char **output, size_t *out_len)
|
||||||
{
|
{
|
||||||
size_t inbytes;
|
size_t inbytes;
|
||||||
size_t outbytes;
|
size_t outbytes;
|
||||||
@ -278,7 +278,8 @@ int strnconv(const char *str, const char *icharset, const char *ocharset,
|
|||||||
*ret = '\0';
|
*ret = '\0';
|
||||||
iso_iconv_close(&conv, 0);
|
iso_iconv_close(&conv, 0);
|
||||||
|
|
||||||
*output = malloc(ret - out + 1);
|
*out_len = ret - out;
|
||||||
|
*output = malloc(*out_len + 1);
|
||||||
if (*output == NULL) {
|
if (*output == NULL) {
|
||||||
retval = ISO_OUT_OF_MEM;
|
retval = ISO_OUT_OF_MEM;
|
||||||
goto ex;
|
goto ex;
|
||||||
@ -291,6 +292,15 @@ ex:;
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
||||||
|
size_t len, char **output)
|
||||||
|
{
|
||||||
|
size_t l;
|
||||||
|
|
||||||
|
return strnconvl(str, icharset, ocharset, len, output, &l);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a str in a specified codeset to WCHAR_T.
|
* Convert a str in a specified codeset to WCHAR_T.
|
||||||
* The result must be free() when no more needed
|
* The result must be free() when no more needed
|
||||||
@ -667,6 +677,123 @@ int str2ucs(const char *icharset, const char *input, uint16_t **output)
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int str2utf16be(const char *icharset, const char *input, uint16_t **output)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
wchar_t *wsrc_ = NULL;
|
||||||
|
char *src;
|
||||||
|
char *ret = NULL;
|
||||||
|
char *ret_ = NULL;
|
||||||
|
struct iso_iconv_handle conv;
|
||||||
|
int conv_ret = 0;
|
||||||
|
int direct_conv = 0;
|
||||||
|
size_t loop_counter = 0, loop_limit = 3;
|
||||||
|
size_t numchars;
|
||||||
|
size_t outbytes;
|
||||||
|
size_t inbytes;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
if (icharset == NULL || input == NULL || output == NULL) {
|
||||||
|
return ISO_NULL_POINTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Try the direct conversion.
|
||||||
|
*/
|
||||||
|
conv_ret = iso_iconv_open(&conv, "UTF-16BE", (char *) icharset, 0);
|
||||||
|
if (conv_ret > 0) {
|
||||||
|
direct_conv = 1;
|
||||||
|
src = (char *) input;
|
||||||
|
inbytes = strlen(input);
|
||||||
|
loop_limit = inbytes + 3;
|
||||||
|
outbytes = (2 * inbytes + 1) * sizeof(uint16_t);
|
||||||
|
ret_ = malloc(outbytes);
|
||||||
|
if (ret_ == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
ret = ret_;
|
||||||
|
} else {
|
||||||
|
/* Try via intermediate character set WCHAR_T.
|
||||||
|
*/
|
||||||
|
result = str2wchar(icharset, input, &wsrc_);
|
||||||
|
if (result == (int) ISO_SUCCESS) {
|
||||||
|
src = (char *)wsrc_;
|
||||||
|
numchars = wcslen(wsrc_);
|
||||||
|
|
||||||
|
inbytes = numchars * sizeof(wchar_t);
|
||||||
|
loop_limit = inbytes + 3;
|
||||||
|
|
||||||
|
ret_ = malloc((2 * numchars+1) * sizeof(uint16_t));
|
||||||
|
if (ret_ == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
outbytes = 2 * numchars * sizeof(uint16_t);
|
||||||
|
ret = ret_;
|
||||||
|
|
||||||
|
/* initialize iconv */
|
||||||
|
conv_ret = iso_iconv_open(&conv, "UTF-16BE", "WCHAR_T", 0);
|
||||||
|
if (conv_ret <= 0) {
|
||||||
|
free(wsrc_);
|
||||||
|
free(ret_);
|
||||||
|
}
|
||||||
|
} else if (result != (int) ISO_CHARSET_CONV_ERROR)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (conv_ret <= 0) {
|
||||||
|
return ISO_CHARSET_CONV_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = iso_iconv(&conv, &src, &inbytes, &ret, &outbytes, 0);
|
||||||
|
while (n == (size_t) -1) {
|
||||||
|
/* The destination buffer is too small. Stops here. */
|
||||||
|
if (errno == E2BIG)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* An incomplete multi bytes sequence was found. We
|
||||||
|
* can't do anything here. That's quite unlikely. */
|
||||||
|
if (errno == EINVAL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* The last possible error is an invalid multi bytes
|
||||||
|
* sequence. Just replace the character with a "_".
|
||||||
|
* Probably the character doesn't exist in UCS */
|
||||||
|
set_ucsbe((uint16_t*) ret, '_');
|
||||||
|
ret += sizeof(uint16_t);
|
||||||
|
outbytes -= sizeof(uint16_t);
|
||||||
|
|
||||||
|
if (!outbytes)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* There was an error with one character but some other remain
|
||||||
|
* to be converted. That's probably a multibyte character.
|
||||||
|
* See above comment. */
|
||||||
|
if (direct_conv) {
|
||||||
|
src++;
|
||||||
|
inbytes--;
|
||||||
|
} else {
|
||||||
|
src += sizeof(wchar_t);
|
||||||
|
inbytes -= sizeof(wchar_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inbytes)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Just to appease my remorse about unclear loop ends */
|
||||||
|
loop_counter++;
|
||||||
|
if (loop_counter > loop_limit)
|
||||||
|
break;
|
||||||
|
n = iso_iconv(&conv, &src, &inbytes, &ret, &outbytes, 0);
|
||||||
|
}
|
||||||
|
iso_iconv_close(&conv, 0);
|
||||||
|
|
||||||
|
/* close the UTF-16 string */
|
||||||
|
set_ucsbe((uint16_t*) ret, '\0');
|
||||||
|
if (wsrc_ != NULL)
|
||||||
|
free(wsrc_);
|
||||||
|
|
||||||
|
*output = (uint16_t*)ret_;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int valid_d_char(char c)
|
static int valid_d_char(char c)
|
||||||
{
|
{
|
||||||
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == '_');
|
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == '_');
|
||||||
@ -1080,7 +1207,7 @@ uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
|||||||
{
|
{
|
||||||
uint16_t *dot, *retval = NULL;
|
uint16_t *dot, *retval = NULL;
|
||||||
size_t lname, lext, lnname, lnext, pos, i, maxchar = 64;
|
size_t lname, lext, lnname, lnext, pos, i, maxchar = 64;
|
||||||
uint16_t *dest = NULL;
|
uint16_t *dest = NULL, c;
|
||||||
|
|
||||||
LIBISO_ALLOC_MEM_VOID(dest, uint16_t, LIBISO_JOLIET_NAME_MAX);
|
LIBISO_ALLOC_MEM_VOID(dest, uint16_t, LIBISO_JOLIET_NAME_MAX);
|
||||||
/* was: 66 = 64 (name + ext) + 1 (.) + 1 (\0) */
|
/* was: 66 = 64 (name + ext) + 1 (.) + 1 (\0) */
|
||||||
@ -1120,7 +1247,7 @@ uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
|||||||
|
|
||||||
/* Convert up to lnname characters of the filename. */
|
/* Convert up to lnname characters of the filename. */
|
||||||
for (i = 0; i < lnname; i++) {
|
for (i = 0; i < lnname; i++) {
|
||||||
uint16_t c = src[i];
|
c = src[i];
|
||||||
if (valid_j_char(c)) {
|
if (valid_j_char(c)) {
|
||||||
dest[pos++] = c;
|
dest[pos++] = c;
|
||||||
} else {
|
} else {
|
||||||
@ -1128,6 +1255,8 @@ uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (pos > 0)
|
||||||
|
iso_handle_split_utf16(dest + (pos - 1));
|
||||||
|
|
||||||
if ((flag & 1) && lnext <= 0)
|
if ((flag & 1) && lnext <= 0)
|
||||||
goto is_done;
|
goto is_done;
|
||||||
@ -1145,6 +1274,7 @@ uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
iso_handle_split_utf16(dest + (pos - 1));
|
||||||
|
|
||||||
is_done:;
|
is_done:;
|
||||||
set_ucsbe(dest + pos, '\0');
|
set_ucsbe(dest + pos, '\0');
|
||||||
@ -1181,6 +1311,7 @@ uint16_t *iso_j_dir_id(const uint16_t *src, int flag)
|
|||||||
set_ucsbe(dest + i, '_');
|
set_ucsbe(dest + i, '_');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
iso_handle_split_utf16(dest + (len - 1));
|
||||||
set_ucsbe(dest + len, '\0');
|
set_ucsbe(dest + len, '\0');
|
||||||
retval = ucsdup(dest);
|
retval = ucsdup(dest);
|
||||||
ex:
|
ex:
|
||||||
@ -1262,6 +1393,8 @@ uint16_t *ucsncpy(uint16_t *dest, const uint16_t *src, size_t n)
|
|||||||
{
|
{
|
||||||
n = MIN(n, ucslen(src) + 1);
|
n = MIN(n, ucslen(src) + 1);
|
||||||
memcpy(dest, src, n*2);
|
memcpy(dest, src, n*2);
|
||||||
|
if (n >= 2)
|
||||||
|
iso_handle_split_utf16(dest + (n - 2));
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2092,3 +2225,40 @@ uint16_t iso_htons(uint16_t v)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* If an UTF-16 surrogate pair was split : Change to UTF-16 '_'.
|
||||||
|
(UCS-2 is promised to reserve 0xd800 to 0xdbff for UTF-16).
|
||||||
|
*/
|
||||||
|
void iso_handle_split_utf16(uint16_t *utf_word)
|
||||||
|
{
|
||||||
|
unsigned char *hb;
|
||||||
|
|
||||||
|
hb = (unsigned char *) utf_word;
|
||||||
|
if ((hb[0] & 0xfc) == 0xd8)
|
||||||
|
set_ucsbe(utf_word, '_');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int iso_clone_mem(char *in, char **out, size_t size)
|
||||||
|
{
|
||||||
|
if (in == NULL) {
|
||||||
|
*out = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (size == 0)
|
||||||
|
size = strlen(in) + 1;
|
||||||
|
*out = calloc(1, size);
|
||||||
|
if (*out == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
memcpy(*out, in, size);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int iso_clone_mgtd_mem(char *in, char **out, size_t size)
|
||||||
|
{
|
||||||
|
if (*out != NULL)
|
||||||
|
free(*out);
|
||||||
|
return iso_clone_mem(in, out, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -56,9 +56,16 @@ int iso_init_locale(int flag);
|
|||||||
int strconv(const char *input, const char *icharset, const char *ocharset,
|
int strconv(const char *input, const char *icharset, const char *ocharset,
|
||||||
char **output);
|
char **output);
|
||||||
|
|
||||||
|
/* Like strconv but processing len input bytes rather than strlen(input)
|
||||||
|
*/
|
||||||
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
int strnconv(const char *str, const char *icharset, const char *ocharset,
|
||||||
size_t len, char **output);
|
size_t len, char **output);
|
||||||
|
|
||||||
|
/* Like strnconv but also returning the number of bytes in *output.
|
||||||
|
*/
|
||||||
|
int strnconvl(const char *str, const char *icharset, const char *ocharset,
|
||||||
|
size_t len, char **output, size_t *out_len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a given string from any input charset to ASCII
|
* Convert a given string from any input charset to ASCII
|
||||||
*
|
*
|
||||||
@ -88,6 +95,22 @@ int str2ascii(const char *icharset, const char *input, char **output);
|
|||||||
*/
|
*/
|
||||||
int str2ucs(const char *icharset, const char *input, uint16_t **output);
|
int str2ucs(const char *icharset, const char *input, uint16_t **output);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a given string from any input charset to UTF-16BE charset,
|
||||||
|
* used for HFS+ file identifiers.
|
||||||
|
* (UTF-16 differs from older UCS-2 by having multi word characters.)
|
||||||
|
*
|
||||||
|
* @param icharset
|
||||||
|
* Input charset. Must be supported by iconv
|
||||||
|
* @param input
|
||||||
|
* Input string
|
||||||
|
* @param output
|
||||||
|
* Location where the pointer to the ouput string will be stored
|
||||||
|
* @return
|
||||||
|
* 1 on success, < 0 on error
|
||||||
|
*/
|
||||||
|
int str2utf16be(const char *icharset, const char *input, uint16_t **output);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a level 1 directory identifier.
|
* Create a level 1 directory identifier.
|
||||||
*
|
*
|
||||||
@ -220,6 +243,12 @@ uint16_t *ucscpy(uint16_t *dest, const uint16_t *src);
|
|||||||
*/
|
*/
|
||||||
uint16_t *ucsncpy(uint16_t *dest, const uint16_t *src, size_t n);
|
uint16_t *ucsncpy(uint16_t *dest, const uint16_t *src, size_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether utf_word is the first surrogate word of a pair.
|
||||||
|
* If so, change it to UTF-16 character '_'.
|
||||||
|
*/
|
||||||
|
void iso_handle_split_utf16(uint16_t *utf_word);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a given input string to d-chars.
|
* Convert a given input string to d-chars.
|
||||||
* @return
|
* @return
|
||||||
@ -577,6 +606,19 @@ void *iso_alloc_mem(size_t size, size_t count, int flag);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@param in Valid memory or NULL
|
||||||
|
@param out Returns valid memory or NULL
|
||||||
|
@param size Number of bytes to copy. 0 means strlen(in)+1 if not NULL.
|
||||||
|
@return 1 or ISO_OUT_OF_MEM
|
||||||
|
*/
|
||||||
|
int iso_clone_mem(char *in, char **out, size_t size);
|
||||||
|
|
||||||
|
/* Like iso_clone_mem but first freeing *out if not NULL
|
||||||
|
*/
|
||||||
|
int iso_clone_mgtd_mem(char *in, char **out, size_t size);
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user