Compare commits
23 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
46e96ee616 | |||
7e60e60e62 | |||
d55ed2d1ca | |||
77c8349c56 | |||
b1c7ed6e29 | |||
e886722d65 | |||
b80b339de3 | |||
efbd05203d | |||
6ca1d76d60 | |||
e1b54056e8 | |||
d5cd610ac7 | |||
91f5ebb376 | |||
ff3b439bda | |||
4672c79181 | |||
83cb07b23c | |||
439a14da1d | |||
d66eef42f6 | |||
337bade549 | |||
eb6503a8ad | |||
1a2e1c767e | |||
858c5479c8 | |||
d36b3d04a8 | |||
da41eb8c6e |
21
ChangeLog
21
ChangeLog
@ -1,9 +1,28 @@
|
||||
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
|
||||
===============================================================================
|
||||
* New API call iso_image_get_pvd_times().
|
||||
* 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
|
||||
===============================================================================
|
||||
|
14
configure.ac
14
configure.ac
@ -1,4 +1,4 @@
|
||||
AC_INIT([libisofs], [1.2.8], [http://libburnia-project.org])
|
||||
AC_INIT([libisofs], [1.3.2], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
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
|
||||
LIBISOFS_MAJOR_VERSION=1
|
||||
LIBISOFS_MINOR_VERSION=2
|
||||
LIBISOFS_MICRO_VERSION=8
|
||||
LIBISOFS_MINOR_VERSION=3
|
||||
LIBISOFS_MICRO_VERSION=2
|
||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
@ -51,10 +51,10 @@ AC_SUBST(LIBISOFS_VERSION)
|
||||
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
||||
# 2013.03.18 development jump has not yet happened
|
||||
# SONAME = 70 - 64 = 6 . Library name = libisofs.6.64.0
|
||||
LT_CURRENT=70
|
||||
LT_AGE=64
|
||||
# 2013.08.07 development jump has not yet happened
|
||||
# SONAME = 74 - 68 = 6 . Library name = libisofs.6.68.0
|
||||
LT_CURRENT=74
|
||||
LT_AGE=68
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
|
@ -906,13 +906,18 @@ PReP boots via a MBR partition containing only raw ELF and having type 0x41.
|
||||
|
||||
Sources:
|
||||
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
|
||||
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
|
||||
in the ISO image.
|
||||
in the ISO image [without causing overlapping between partitions].
|
||||
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -501,13 +501,23 @@ void ecma119_set_voldescr_times(IsoImageWriter *writer,
|
||||
else
|
||||
iso_datetime_17(vol->vol_modification_time, t->now, t->always_gmt);
|
||||
|
||||
if (t->vol_expiration_time > 0)
|
||||
if (t->vol_expiration_time > 0) {
|
||||
iso_datetime_17(vol->vol_expiration_time, t->vol_expiration_time,
|
||||
t->always_gmt);
|
||||
} else {
|
||||
for(i = 0; i < 16; i++)
|
||||
vol->vol_expiration_time[i] = '0';
|
||||
vol->vol_expiration_time[16] = 0;
|
||||
}
|
||||
|
||||
if (t->vol_effective_time > 0)
|
||||
if (t->vol_effective_time > 0) {
|
||||
iso_datetime_17(vol->vol_effective_time, t->vol_effective_time,
|
||||
t->always_gmt);
|
||||
} else {
|
||||
for(i = 0; i < 16; i++)
|
||||
vol->vol_effective_time[i] = '0';
|
||||
vol->vol_effective_time[16] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -587,6 +597,8 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
||||
ecma119_set_voldescr_times(writer, &vol);
|
||||
vol.file_structure_version[0] = 1;
|
||||
|
||||
memcpy(vol.app_use, image->application_use, 512);
|
||||
|
||||
free(vol_id);
|
||||
free(volset_id);
|
||||
free(pub_id);
|
||||
@ -980,6 +992,14 @@ int ecma119_writer_create(Ecma119Image *target)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (target->image->sparc_core_node != NULL) {
|
||||
/* Obtain a duplicate of the IsoFile's Ecma119Node->file */
|
||||
ret = iso_file_src_create(target, target->image->sparc_core_node,
|
||||
&target->sparc_core_src);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(target->partition_offset > 0) {
|
||||
/* Create second tree */
|
||||
target->eff_partition_offset = target->partition_offset;
|
||||
@ -1872,6 +1892,8 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
||||
target->mipsel_p_vaddr = 0;
|
||||
target->mipsel_p_filesz = 0;
|
||||
|
||||
target->sparc_core_src = NULL;
|
||||
|
||||
target->empty_file_block = 0;
|
||||
target->tree_end_block = 0;
|
||||
|
||||
@ -3265,7 +3287,7 @@ int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
|
||||
memcpy(opts->system_area_data, data, 32768);
|
||||
}
|
||||
if (!(flag & 4))
|
||||
opts->system_area_options = options & 0x3fff;
|
||||
opts->system_area_options = options & 0x7fff;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 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
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
@ -825,6 +825,11 @@ struct ecma119_image
|
||||
uint32_t mipsel_p_vaddr;
|
||||
uint32_t mipsel_p_filesz;
|
||||
|
||||
/* A data file of which the position and size shall be written after
|
||||
a SUN Disk Label.
|
||||
*/
|
||||
IsoFileSrc *sparc_core_src;
|
||||
|
||||
char *appended_partitions[ISO_MAX_PARTITIONS];
|
||||
uint8_t appended_part_types[ISO_MAX_PARTITIONS];
|
||||
/* Counted in blocks of 2048 */
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 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
|
||||
* 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 */
|
||||
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)
|
||||
{
|
||||
bootimg->isolinux_options = (options & 0x01ff);
|
||||
bootimg->isolinux_options = (options & 0x03ff);
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
/* API */
|
||||
int el_torito_get_isolinux_options(ElToritoBootImage *bootimg, int flag)
|
||||
{
|
||||
return bootimg->isolinux_options & 0x01ff;
|
||||
return bootimg->isolinux_options & 0x03ff;
|
||||
}
|
||||
|
||||
/* API */
|
||||
@ -1096,7 +1102,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
|
||||
* 1 on success, 0 error (but continue), < 0 error
|
||||
@ -1117,6 +1123,27 @@ int patch_boot_info_table(uint8_t *buf, Ecma119Image *t,
|
||||
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 */
|
||||
int iso_patch_eltoritos(Ecma119Image *t)
|
||||
{
|
||||
@ -1130,7 +1157,7 @@ int iso_patch_eltoritos(Ecma119Image *t)
|
||||
return ISO_SUCCESS;
|
||||
|
||||
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;
|
||||
original = t->bootsrc[idx]->stream;
|
||||
size = (size_t) iso_stream_get_size(original);
|
||||
@ -1154,9 +1181,20 @@ int iso_patch_eltoritos(Ecma119Image *t)
|
||||
}
|
||||
|
||||
/* ok, patch the read buffer */
|
||||
ret = patch_boot_info_table(buf, t, size, idx);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
if (t->catalog->bootimages[idx]->isolinux_options & 0x200) {
|
||||
/* GRUB2 boot provisions */
|
||||
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
|
||||
|
@ -58,6 +58,7 @@ struct el_torito_boot_image {
|
||||
* Whether the boot image seems to contain a boot_info_table
|
||||
*/
|
||||
unsigned int seems_boot_info_table:1;
|
||||
unsigned int seems_grub2_boot_info:1;
|
||||
/**
|
||||
* isolinux options
|
||||
* 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);
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
@ -35,6 +35,22 @@
|
||||
#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.
|
||||
* There are four kind of options:
|
||||
@ -314,6 +330,30 @@ typedef struct
|
||||
*/
|
||||
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;
|
||||
|
||||
} _ImageFsData;
|
||||
|
||||
typedef struct image_fs_data ImageFileSourceData;
|
||||
@ -1233,6 +1273,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
|
||||
@ -1423,8 +1487,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = read_rr_PX(sue, &atts);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid PX entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 0, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid PX entry");
|
||||
fsdata->px_ino_status |= 8;
|
||||
} if (ret == 2) {
|
||||
if (fsdata->inode_counter < atts.st_ino)
|
||||
@ -1439,13 +1503,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = read_rr_TF(sue, &atts);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid TF entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 1, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid TF entry");
|
||||
}
|
||||
} else if (SUSP_SIG(sue, 'N', 'M')) {
|
||||
if (name != NULL && namecont == 0) {
|
||||
/* 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"
|
||||
"CONTINUE flag. Ignored");
|
||||
continue;
|
||||
@ -1453,13 +1517,52 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = read_rr_NM(sue, &name, &namecont);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid NM entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 3, ISO_WRONG_RR_WARN, ret,
|
||||
"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')) {
|
||||
if (linkdest != NULL && linkdestcont == 0) {
|
||||
/* 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"
|
||||
"CONTINUE flag. Ignored");
|
||||
continue;
|
||||
@ -1467,8 +1570,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = read_rr_SL(sue, &linkdest, &linkdestcont);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid SL entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 5, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid SL entry");
|
||||
}
|
||||
} else if (SUSP_SIG(sue, 'R', 'E')) {
|
||||
/*
|
||||
@ -1488,7 +1591,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
*/
|
||||
relocated_dir = iso_read_bb(sue->data.CL.child_loc, 4, NULL);
|
||||
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");
|
||||
break;
|
||||
}
|
||||
@ -1496,12 +1599,12 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = read_rr_PN(sue, &atts);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid PN entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 7, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid PN entry");
|
||||
}
|
||||
} else if (SUSP_SIG(sue, 'S', 'F')) {
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_UNSUPPORTED_RR, 0,
|
||||
"Sparse files not supported.");
|
||||
ret = iso_rr_msg_submit(fsdata, 8, ISO_UNSUPPORTED_RR, 0,
|
||||
"Sparse files not supported.");
|
||||
break;
|
||||
} else if (SUSP_SIG(sue, 'R', 'R')) {
|
||||
/* This was an optional flag byte in RRIP 1.09 which told the
|
||||
@ -1516,7 +1619,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
*/
|
||||
if (!(flag & 1)) {
|
||||
/* 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 "
|
||||
"than '.' entry of root node");
|
||||
}
|
||||
@ -1528,7 +1631,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
*/
|
||||
if (!(flag & 1)) {
|
||||
/* 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 "
|
||||
"than '.' entry of root node");
|
||||
}
|
||||
@ -1543,8 +1646,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
&prev_field, &aa_done, 0);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid AA entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 11, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid AA entry");
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1554,8 +1657,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
&prev_field, &aa_done, 0);
|
||||
if (ret < 0) {
|
||||
/* notify and continue */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid AL entry");
|
||||
ret = iso_rr_msg_submit(fsdata, 12, ISO_WRONG_RR_WARN, ret,
|
||||
"Invalid AL entry");
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1567,7 +1670,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
&zisofs_bsl2, &zisofs_usize, 0);
|
||||
if (ret < 0 || zisofs_alg[0] != 'p' || zisofs_alg[1] != 'z') {
|
||||
/* 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");
|
||||
zisofs_hs4 = 0;
|
||||
continue;
|
||||
@ -1593,17 +1696,17 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
/* error was already submitted above */
|
||||
iso_msg_debug(fsdata->msgid, "Error parsing RR entries");
|
||||
} 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 "
|
||||
"contains invalid values.");
|
||||
} else {
|
||||
/* ensure both name and link dest are finished */
|
||||
if (namecont != 0) {
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
||||
"Incomplete RR name, last NM entry continues");
|
||||
ret = iso_rr_msg_submit(fsdata, 15, ISO_WRONG_RR, 0,
|
||||
"Incomplete Rock Ridge name, last NM entry continues");
|
||||
}
|
||||
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");
|
||||
}
|
||||
}
|
||||
@ -1617,6 +1720,7 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = iso_aa_lookup_attr(aa_string, "isofs.cs",
|
||||
&cs_value_length, &cs_value, 0);
|
||||
if (ret == 1) {
|
||||
LIBISO_FREE_MEM(msg);
|
||||
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||
if (fsdata->auto_input_charset & 1) {
|
||||
if (fsdata->input_charset != NULL)
|
||||
@ -1644,10 +1748,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
&newname);
|
||||
if (ret < 0) {
|
||||
/* its just a hint message */
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET,
|
||||
ret, "Charset conversion error. Cannot "
|
||||
"convert from %s to %s",
|
||||
LIBISO_FREE_MEM(msg);
|
||||
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||
sprintf(msg,
|
||||
"Charset conversion error. Cannot convert from %.40s to %.40s",
|
||||
fsdata->input_charset, fsdata->local_charset);
|
||||
ret = iso_rr_msg_submit(fsdata, 17, ISO_FILENAME_WRONG_CHARSET,
|
||||
ret, msg);
|
||||
free(newname);
|
||||
if (ret < 0) {
|
||||
free(name);
|
||||
@ -1666,10 +1773,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
ret = strconv(linkdest, fsdata->input_charset,
|
||||
fsdata->local_charset, &newlinkdest);
|
||||
if (ret < 0) {
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_FILENAME_WRONG_CHARSET,
|
||||
ret, "Charset conversion error. Cannot "
|
||||
"convert from %s to %s",
|
||||
LIBISO_FREE_MEM(msg);
|
||||
LIBISO_ALLOC_MEM(msg, char, 160);
|
||||
sprintf(msg,
|
||||
"Charset conversion error. Cannot convert from %.40s to %.40s",
|
||||
fsdata->input_charset, fsdata->local_charset);
|
||||
ret = iso_rr_msg_submit(fsdata, 17, ISO_FILENAME_WRONG_CHARSET,
|
||||
ret, msg);
|
||||
free(newlinkdest);
|
||||
if (ret < 0) {
|
||||
free(name);
|
||||
@ -1792,8 +1902,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent,
|
||||
|
||||
/* TODO #00014 : more sanity checks to ensure dir record info is valid */
|
||||
if (S_ISLNK(atts.st_mode) && (linkdest == NULL)) {
|
||||
ret = iso_msg_submit(fsdata->msgid, ISO_WRONG_RR, 0,
|
||||
"Link without destination.");
|
||||
ret = iso_rr_msg_submit(fsdata, 18, ISO_WRONG_RR, 0,
|
||||
"Link without destination.");
|
||||
free(name);
|
||||
goto ex;
|
||||
}
|
||||
@ -2131,6 +2241,27 @@ int read_root_susp_entries(_ImageFsData *data, uint32_t block)
|
||||
/* record will be the "." directory entry for the root record */
|
||||
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
|
||||
* SUSP specification claims that for CD-ROM XA the SP entry
|
||||
@ -2623,6 +2754,8 @@ int iso_image_filesystem_new(IsoDataSource *src, struct iso_read_opts *opts,
|
||||
data->bootblocks[i] = 0;
|
||||
data->inode_counter = 0;
|
||||
data->px_ino_status = 0;
|
||||
data->rr_err_reported = 0;
|
||||
data->rr_err_repeated = 0;
|
||||
|
||||
|
||||
data->local_charset = strdup(iso_get_local_charset(0));
|
||||
@ -2971,8 +3104,19 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
|
||||
/*
|
||||
* and we set the sort weight based on the block on image, to
|
||||
* 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->node.type = LIBISO_FILE;
|
||||
@ -3242,13 +3386,14 @@ static
|
||||
int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
||||
IsoDataSource *src, uint32_t iso_image_size, int flag)
|
||||
{
|
||||
int i, ret, section_count, todo, chunk;
|
||||
int i, j, ret, section_count, todo, chunk;
|
||||
uint32_t img_lba, img_size, boot_pvd_found, image_pvd, alleged_size;
|
||||
struct iso_file_section *sections = NULL;
|
||||
struct el_torito_boot_image *boot;
|
||||
uint8_t *boot_image_buf = NULL, boot_info_found[16], *buf = NULL;
|
||||
IsoStream *stream = NULL;
|
||||
IsoFile *boot_file;
|
||||
uint64_t blk;
|
||||
|
||||
if (image->bootcat == NULL)
|
||||
{ret = ISO_SUCCESS; goto ex;}
|
||||
@ -3257,6 +3402,7 @@ int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
||||
boot = image->bootcat->bootimages[i];
|
||||
boot_file = boot->image;
|
||||
boot->seems_boot_info_table = 0;
|
||||
boot->seems_grub2_boot_info = 0;
|
||||
img_size = iso_file_get_size(boot_file);
|
||||
if (img_size > Libisofs_boot_image_max_sizE || img_size < 64)
|
||||
continue;
|
||||
@ -3322,6 +3468,16 @@ int iso_image_eval_boot_info_table(IsoImage *image, struct iso_read_opts *opts,
|
||||
goto ex;
|
||||
if (memcmp(boot_image_buf + 8, boot_info_found, 16) == 0)
|
||||
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);
|
||||
boot_image_buf = NULL;
|
||||
}
|
||||
@ -3527,7 +3683,7 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
||||
/* warn about hidden images */
|
||||
iso_msg_submit(image->id, ISO_EL_TORITO_HIDDEN, 0,
|
||||
"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.");
|
||||
}
|
||||
if (image->bootcat->node == NULL) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 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
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
@ -78,11 +78,13 @@ int iso_image_new(const char *name, IsoImage **image)
|
||||
img->volset_id = strdup(name);
|
||||
img->volume_id = strdup(name);
|
||||
}
|
||||
memset(img->application_use, 0, 512);
|
||||
img->system_area_data = NULL;
|
||||
img->system_area_options = 0;
|
||||
img->num_mips_boot_files = 0;
|
||||
for (i = 0; i < 15; i++)
|
||||
img->mips_boot_file_paths[i] = NULL;
|
||||
img->sparc_core_node = NULL;
|
||||
img->builder_ignore_acl = 1;
|
||||
img->builder_ignore_ea = 1;
|
||||
img->inode_counter = 0;
|
||||
@ -136,6 +138,8 @@ void iso_image_unref(IsoImage *image)
|
||||
iso_filesystem_unref(image->fs);
|
||||
el_torito_boot_catalog_free(image->bootcat);
|
||||
iso_image_give_up_mips_boot(image, 0);
|
||||
if (image->sparc_core_node != NULL)
|
||||
iso_node_unref((IsoNode *) image->sparc_core_node);
|
||||
free(image->volset_id);
|
||||
free(image->volume_id);
|
||||
free(image->publisher_id);
|
||||
@ -370,6 +374,19 @@ int iso_image_get_pvd_times(IsoImage *image,
|
||||
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)
|
||||
{
|
||||
return image->id;
|
||||
@ -389,6 +406,14 @@ static
|
||||
int dir_update_size(IsoImage *image, IsoDir *dir)
|
||||
{
|
||||
IsoNode *pos;
|
||||
|
||||
#ifdef Libisofs_update_sizes_abortablE
|
||||
char *path= NULL;
|
||||
IsoStream *base_stream;
|
||||
int cancel_ret, ret;
|
||||
uint32_t lba;
|
||||
#endif
|
||||
|
||||
pos = dir->children;
|
||||
while (pos) {
|
||||
int ret = 1;
|
||||
@ -397,13 +422,51 @@ int dir_update_size(IsoImage *image, IsoDir *dir)
|
||||
} else if (pos->type == LIBISO_DIR) {
|
||||
/* recurse */
|
||||
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
|
||||
|
||||
}
|
||||
|
||||
#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) {
|
||||
ret = iso_msg_submit(image->id, ret, 0, NULL);
|
||||
if (ret < 0) {
|
||||
return ret; /* cancel due error threshold */
|
||||
cancel_ret = iso_msg_submit(image->id, ret, 0, NULL);
|
||||
path = iso_tree_get_node_path(pos);
|
||||
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 */
|
||||
}
|
||||
|
||||
#endif /* Libisofs_update_sizes_abortablE */
|
||||
|
||||
pos = pos->next;
|
||||
}
|
||||
return ISO_SUCCESS;
|
||||
@ -767,3 +830,24 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -53,6 +53,7 @@ struct Iso_Image
|
||||
char *modification_time;
|
||||
char *expiration_time;
|
||||
char *effective_time;
|
||||
char application_use[512];
|
||||
|
||||
/* el-torito boot catalog */
|
||||
struct el_torito_boot_catalog *bootcat;
|
||||
@ -69,6 +70,10 @@ struct Iso_Image
|
||||
int num_mips_boot_files;
|
||||
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;
|
||||
|
||||
/* image identifier, for message origin identifier */
|
||||
int id;
|
||||
|
@ -83,8 +83,8 @@
|
||||
* @since 0.6.2
|
||||
*/
|
||||
#define iso_lib_header_version_major 1
|
||||
#define iso_lib_header_version_minor 2
|
||||
#define iso_lib_header_version_micro 8
|
||||
#define iso_lib_header_version_minor 3
|
||||
#define iso_lib_header_version_micro 2
|
||||
|
||||
/**
|
||||
* Get version of the libisofs library at runtime.
|
||||
@ -2156,23 +2156,25 @@ int iso_write_opts_set_fifo_size(IsoWriteOpts *opts, size_t fifo_size);
|
||||
* bit2-7= System area type
|
||||
* 0= with bit0 or bit1: MBR
|
||||
* else: unspecified type which will be used unaltered.
|
||||
* @since 0.6.38
|
||||
* 1= MIPS Big Endian Volume Header
|
||||
* @since 0.6.38
|
||||
* Submit up to 15 MIPS Big Endian boot files by
|
||||
* iso_image_add_mips_boot_file().
|
||||
* This will overwrite the first 512 bytes of the submitted
|
||||
* data.
|
||||
* 2= DEC Boot Block for MIPS Little Endian
|
||||
* @since 0.6.38
|
||||
* The first boot file submitted by
|
||||
* iso_image_add_mips_boot_file() will be activated.
|
||||
* This will overwrite the first 512 bytes of the submitted
|
||||
* data.
|
||||
* @since 0.6.40
|
||||
* 3= SUN Disk Label for SUN SPARC
|
||||
* @since 0.6.40
|
||||
* Submit up to 7 SPARC boot images by
|
||||
* iso_write_opts_set_partition_img() for partition numbers 2
|
||||
* to 8.
|
||||
* This will overwrite the first 512 bytes of the submitted
|
||||
* data.
|
||||
* bit8-9= Only with System area type 0 = MBR
|
||||
* @since 1.0.4
|
||||
* Cylinder alignment mode eventually pads the image to make it
|
||||
@ -2191,6 +2193,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
|
||||
* ISO image. Not compatible with any other feature
|
||||
* 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
|
||||
* bit0 = invalidate any attached system area data. Same as data == NULL
|
||||
* (This re-activates eventually loaded image System Area data.
|
||||
@ -2886,7 +2895,7 @@ void iso_image_set_volset_id(IsoImage *image, const char *volset_id);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2902,7 +2911,7 @@ void iso_image_set_volume_id(IsoImage *image, const char *volume_id);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2918,7 +2927,7 @@ void iso_image_set_publisher_id(IsoImage *image, const char *publisher_id);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2935,7 +2944,7 @@ void iso_image_set_data_preparer_id(IsoImage *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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2951,7 +2960,7 @@ void iso_image_set_system_id(IsoImage *image, const char *system_id);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2967,7 +2976,7 @@ void iso_image_set_application_id(IsoImage *image, const char *application_id);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -2985,7 +2994,7 @@ void iso_image_set_copyright_file_id(IsoImage *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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -3003,7 +3012,7 @@ void iso_image_set_abstract_file_id(IsoImage *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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -3020,13 +3029,42 @@ void iso_image_set_biblio_file_id(IsoImage *image, const char *biblio_file_id);
|
||||
|
||||
/**
|
||||
* Get the biblio information of a image.
|
||||
* The returned string is owned by the image and should not be freed nor
|
||||
* changed.
|
||||
* The returned string is owned by the image and must not be freed or changed.
|
||||
*
|
||||
* @since 0.6.2
|
||||
*/
|
||||
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
|
||||
@ -3085,7 +3123,7 @@ int iso_image_get_pvd_times(IsoImage *image,
|
||||
* creation time.
|
||||
* @param boot
|
||||
* 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
|
||||
* via iso_image_unref(). A NULL value is allowed if you don't need a
|
||||
* reference to the boot image.
|
||||
@ -3135,7 +3173,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
|
||||
* 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
|
||||
* 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
|
||||
@ -3147,7 +3185,7 @@ int iso_image_add_boot_image(IsoImage *image, const char *image_path,
|
||||
* The image from which to get the boot image.
|
||||
* @param boot
|
||||
* 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
|
||||
* disposed via iso_image_unref().
|
||||
* @param imgnode
|
||||
@ -3465,9 +3503,15 @@ int el_torito_get_selection_crit(ElToritoBootImage *bootimg, uint8_t crit[20]);
|
||||
* @param bootimg
|
||||
* The image to inquire
|
||||
* @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
|
||||
* 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
|
||||
*/
|
||||
int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag);
|
||||
@ -3531,6 +3575,11 @@ int el_torito_seems_boot_info_table(ElToritoBootImage *bootimg, int flag);
|
||||
* mentioned. The ISOLINUX MBR must look suitable or else an error
|
||||
* event will happen at image generation time.
|
||||
* @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
|
||||
* Reserved for future usage, set to 0.
|
||||
* @return
|
||||
@ -3574,7 +3623,7 @@ void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg);
|
||||
* @param img
|
||||
* The image to be inquired.
|
||||
* @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
|
||||
* The option bits which will be applied if not overridden by
|
||||
* iso_write_opts_set_system_area(). See there.
|
||||
@ -3638,6 +3687,41 @@ 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);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Increments the reference counting of the given node.
|
||||
@ -3869,7 +3953,7 @@ int iso_node_set_name(IsoNode *node, const char *name);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -4448,7 +4532,7 @@ int iso_dir_find_children(IsoDir* dir, IsoFindCondition *cond,
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @since 0.6.2
|
||||
@ -6366,7 +6450,10 @@ int iso_file_remove_filter(IsoFile *file, int flag);
|
||||
* @param stream
|
||||
* The eventual filter stream to be inquired.
|
||||
* @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
|
||||
* The input stream, if one exists. Elsewise NULL.
|
||||
* No extra reference to the stream is taken by this call.
|
||||
|
@ -88,6 +88,7 @@ iso_image_fs_get_volume_id;
|
||||
iso_image_generator_is_running;
|
||||
iso_image_get_abstract_file_id;
|
||||
iso_image_get_all_boot_imgs;
|
||||
iso_image_get_app_use;
|
||||
iso_image_get_application_id;
|
||||
iso_image_get_attached_data;
|
||||
iso_image_get_biblio_file_id;
|
||||
@ -101,6 +102,7 @@ iso_image_get_publisher_id;
|
||||
iso_image_get_pvd_times;
|
||||
iso_image_get_root;
|
||||
iso_image_get_session_md5;
|
||||
iso_image_get_sparc_core;
|
||||
iso_image_get_system_area;
|
||||
iso_image_get_system_id;
|
||||
iso_image_get_volset_id;
|
||||
@ -113,6 +115,7 @@ iso_image_new;
|
||||
iso_image_ref;
|
||||
iso_image_remove_boot_image;
|
||||
iso_image_set_abstract_file_id;
|
||||
iso_image_set_app_use;
|
||||
iso_image_set_application_id;
|
||||
iso_image_set_biblio_file_id;
|
||||
iso_image_set_boot_catalog_hidden;
|
||||
@ -122,6 +125,7 @@ iso_image_set_copyright_file_id;
|
||||
iso_image_set_data_preparer_id;
|
||||
iso_image_set_ignore_aclea;
|
||||
iso_image_set_publisher_id;
|
||||
iso_image_set_sparc_core;
|
||||
iso_image_set_system_id;
|
||||
iso_image_set_volset_id;
|
||||
iso_image_set_volume_id;
|
||||
|
@ -139,6 +139,7 @@ int iso_node_xinfo_dispose_cloners(int flag)
|
||||
next = assoc->next;
|
||||
free((char *) assoc);
|
||||
}
|
||||
iso_xinfo_cloner_list= NULL;
|
||||
return(1);
|
||||
}
|
||||
|
||||
@ -344,9 +345,9 @@ const char *iso_error_to_msg(int errcode)
|
||||
case ISO_WRONG_PVD:
|
||||
return "Wrong or damaged Primary Volume Descriptor";
|
||||
case ISO_WRONG_RR:
|
||||
return "Wrong or damaged RR entry";
|
||||
return "Wrong or damaged Rock Ridge entry";
|
||||
case ISO_UNSUPPORTED_RR:
|
||||
return "Unsupported RR feature";
|
||||
return "Unsupported Rock Ridge feature";
|
||||
case ISO_WRONG_ECMA119:
|
||||
return "Wrong or damaged ECMA-119";
|
||||
case ISO_UNSUPPORTED_ECMA119:
|
||||
@ -360,9 +361,9 @@ const char *iso_error_to_msg(int errcode)
|
||||
case ISO_UNSUPPORTED_SUSP:
|
||||
return "Unsupported SUSP feature";
|
||||
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:
|
||||
return "Error on a RR entry that can be ignored";
|
||||
return "Unhandled SUSP entry";
|
||||
case ISO_SUSP_MULTIPLE_ER:
|
||||
return "Multiple ER SUSP entries found";
|
||||
case ISO_UNSUPPORTED_VD:
|
||||
|
@ -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)
|
||||
{
|
||||
IsoStreamIface* class;
|
||||
IsoStream *result = NULL, *next;
|
||||
|
||||
if (stream == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
class = stream->class;
|
||||
if (class->version < 2)
|
||||
return NULL;
|
||||
return class->get_input_stream(stream, 0);
|
||||
while (1) {
|
||||
class = stream->class;
|
||||
if (class->version < 2)
|
||||
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)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Vreixo Formoso
|
||||
* Copyright (c) 2010 - 2012 Thomas Schmitt
|
||||
* Copyright (c) 2010 - 2013 Thomas Schmitt
|
||||
*
|
||||
* This file is part of the libisofs project; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
@ -72,21 +72,25 @@ static int precompute_gpt(Ecma119Image *t);
|
||||
/*
|
||||
* @param flag bit0= img_blocks is start address rather than end address:
|
||||
do not subtract 1
|
||||
bit1= img_blocks is counted in 512-byte units rather than 2 KiB
|
||||
*/
|
||||
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_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 (*img_blocks >= 0x40000000)
|
||||
*img_blocks = 0x40000000 - 1; /* truncate rather than roll over */
|
||||
if (flag & 1)
|
||||
secs = *end_lba = *img_blocks * 4; /* first valid 512-lba */
|
||||
if(flag & 2)
|
||||
secs = img_blocks;
|
||||
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);
|
||||
secs -= *end_cyl * sph * hpc;
|
||||
*end_head = secs / sph;
|
||||
@ -165,10 +169,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,
|
||||
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)
|
||||
{
|
||||
uint8_t *wpt;
|
||||
@ -178,10 +184,12 @@ static int write_mbr_partition_entry(int partition_number, int partition_type,
|
||||
int i;
|
||||
|
||||
after_end = partition_offset + partition_size;
|
||||
iso_compute_cyl_head_sec(&partition_offset, hpc, sph,
|
||||
&start_lba, &start_sec, &start_head, &start_cyl, 1);
|
||||
iso_compute_cyl_head_sec(&after_end, hpc, sph,
|
||||
&end_lba, &end_sec, &end_head, &end_cyl, 0);
|
||||
iso_compute_cyl_head_sec((uint64_t) partition_offset, hpc, sph,
|
||||
&start_lba, &start_sec, &start_head, &start_cyl,
|
||||
1 | (flag & 2));
|
||||
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;
|
||||
|
||||
/* Not bootable */
|
||||
@ -244,7 +252,7 @@ int make_grub_msdos_label(uint32_t img_blocks, int sph, int hpc,
|
||||
uint32_t end_lba, end_sec, end_head, end_cyl;
|
||||
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);
|
||||
|
||||
/* 1) Zero-fill 446-510 */
|
||||
@ -308,9 +316,9 @@ int iso_offset_partition_start(uint32_t img_blocks, uint32_t partition_offset,
|
||||
uint32_t start_lba, start_sec, start_head, start_cyl;
|
||||
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);
|
||||
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);
|
||||
wpt = buf + 446;
|
||||
|
||||
@ -691,7 +699,8 @@ static int write_sun_partition_entry(int partition_number,
|
||||
*/
|
||||
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 */
|
||||
memset(buf, 0, 512);
|
||||
@ -733,6 +742,16 @@ static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
|
||||
/* 508 - 509 | 0xdabe | Magic Number */
|
||||
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 */
|
||||
t->appended_part_start[0] = 0;
|
||||
t->appended_part_size[0] = t->curblock;
|
||||
@ -794,7 +813,7 @@ int iso_quick_gpt_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,
|
||||
int desired_slot)
|
||||
{
|
||||
@ -880,7 +899,7 @@ static int iso_write_apm_entry(Ecma119Image *t, int apm_block_size,
|
||||
else
|
||||
block_fac = 2048 / apm_block_size;
|
||||
|
||||
memset(buf, apm_block_size, 0);
|
||||
memset(buf, 0, apm_block_size);
|
||||
wpt = buf;
|
||||
|
||||
/* Signature */
|
||||
@ -1115,10 +1134,11 @@ static int iso_write_mbr(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf)
|
||||
|
||||
/* <<< Dummy mock-up */
|
||||
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)
|
||||
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)
|
||||
return ret;
|
||||
}
|
||||
@ -1147,7 +1167,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]->start_block;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1184,7 +1204,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,
|
||||
t->mbr_req[q]->start_block, t->mbr_req[q]->block_count,
|
||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||
buf, 0);
|
||||
buf, 2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
buf[446 + i * 16] = t->mbr_req[q]->status_byte;
|
||||
@ -1298,7 +1318,7 @@ int iso_write_gpt_header_block(Ecma119Image *t, uint32_t img_blocks,
|
||||
}
|
||||
|
||||
/* 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;
|
||||
iso_lsb_to_buf(&wpt, crc, 4, 0);
|
||||
|
||||
@ -1417,6 +1437,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
int first_partition = 1, last_partition = 4, apm_flag, part_type;
|
||||
int gpt_count = 0, gpt_idx[128], apm_count = 0;
|
||||
uint32_t img_blocks;
|
||||
uint64_t blk;
|
||||
uint8_t *wpt;
|
||||
|
||||
if ((t == NULL) || (buf == NULL)) {
|
||||
return ISO_NULL_POINTER;
|
||||
@ -1564,7 +1586,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
return ISO_ASSERT_FAILURE;
|
||||
if (t->partition_offset == 0) {
|
||||
/* Re-write partion entry 1 : start at 0, type Linux */
|
||||
ret = write_mbr_partition_entry(1, 0x83, 0, img_blocks,
|
||||
ret = write_mbr_partition_entry(1, 0x83,
|
||||
(uint64_t) 0, (uint64_t) img_blocks,
|
||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||
buf, 0);
|
||||
if (ret < 0)
|
||||
@ -1599,7 +1622,8 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
buf, t->appended_partitions[i][0] == 0);
|
||||
} else {
|
||||
ret = write_mbr_partition_entry(i + 1, t->appended_part_types[i],
|
||||
t->appended_part_start[i], t->appended_part_size[i],
|
||||
(uint64_t) t->appended_part_start[i],
|
||||
(uint64_t) t->appended_part_size[i],
|
||||
t->partition_secs_per_head, t->partition_heads_per_cyl,
|
||||
buf, 0);
|
||||
}
|
||||
@ -1607,6 +1631,15 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||
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;
|
||||
}
|
||||
|
||||
@ -2115,7 +2148,7 @@ tampered_head:;
|
||||
|
||||
/* Compute new header CRC */
|
||||
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);
|
||||
|
||||
/* Copy GPT entries */
|
||||
@ -2226,7 +2259,7 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
if (t->prep_partition != NULL || t->fat || will_have_gpt ||
|
||||
t->mbr_req_count > 0)
|
||||
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);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -2241,21 +2274,25 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
|
||||
}
|
||||
if (t->prep_part_size > 0 || t->fat || will_have_gpt) {
|
||||
/* Protecting MBR entry for ISO start or whole ISO */
|
||||
ret = iso_quick_mbr_entry(t, (uint32_t) t->partition_offset,
|
||||
(uint32_t) 0, will_have_gpt ? 0xee : 0xcd, 0, 0);
|
||||
ret = iso_quick_mbr_entry(t, will_have_gpt ? (uint64_t) 1 :
|
||||
((uint64_t) t->partition_offset) * 4,
|
||||
(uint64_t) 0,
|
||||
will_have_gpt ? 0xee : 0xcd, 0, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
if (t->prep_part_size > 0) {
|
||||
ret = iso_quick_mbr_entry(t, t->curblock, t->prep_part_size, 0x41,
|
||||
0, 0);
|
||||
ret = iso_quick_mbr_entry(t, ((uint64_t) t->curblock) * 4,
|
||||
((uint64_t) t->prep_part_size) * 4,
|
||||
0x41, 0, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
t->curblock += t->prep_part_size;
|
||||
}
|
||||
if (t->prep_part_size > 0 || t->fat) {
|
||||
/* 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,
|
||||
(uint64_t) 0,
|
||||
t->fat ? 0x0c : 0xcd, 0, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -78,13 +78,13 @@ int iso_compute_append_partitions(Ecma119Image *t, int flag);
|
||||
*/
|
||||
struct iso_mbr_partition_request {
|
||||
|
||||
/* Always given in blocks of 2 KiB */
|
||||
uint32_t start_block;
|
||||
/* Always given in blocks of 512 bytes */
|
||||
uint64_t start_block;
|
||||
|
||||
/* A block count of 0 means that the partition reaches up to the start of
|
||||
the next one.
|
||||
*/
|
||||
uint32_t block_count;
|
||||
uint64_t block_count;
|
||||
|
||||
/* Partition type */
|
||||
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.
|
||||
*/
|
||||
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,
|
||||
int desired_slot);
|
||||
|
||||
@ -266,4 +266,17 @@ int gpt_tail_writer_create(Ecma119Image *target);
|
||||
/* Only for up to 36 characters ISO-8859-1 (or ASCII) input */
|
||||
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_ */
|
||||
|
@ -803,6 +803,8 @@ int iso_add_dir_src_rec(IsoImage *image, IsoDir *parent, IsoFileSource *dir)
|
||||
ret = iso_file_source_lstat(file, &info);
|
||||
}
|
||||
if (ret < 0) {
|
||||
ret = iso_msg_submit(image->id, ISO_FILE_CANT_ADD, ret,
|
||||
"Error when adding file %s", path);
|
||||
goto dir_rec_continue;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user