Compare commits
14 Commits
release-0.
...
release-0.
Author | SHA1 | Date | |
---|---|---|---|
481d425580 | |||
99e988d652 | |||
38a7b4a5b1 | |||
9dc894584d | |||
1a7ab679cd | |||
016baf9984 | |||
b089f2e978 | |||
c3d5ab7bc7 | |||
f13167335a | |||
f0f378c38f | |||
907b44c556 | |||
00011036dd | |||
55497d3931 | |||
c47f206fe3 |
54
acinclude.m4
54
acinclude.m4
@ -50,8 +50,9 @@ dnl From Bruno Haible.
|
|||||||
dnl
|
dnl
|
||||||
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
||||||
[
|
[
|
||||||
|
|
||||||
dnl Check whether it is allowed to link with -liconv
|
dnl Check whether it is allowed to link with -liconv
|
||||||
AC_MSG_CHECKING([for separate -liconv ])
|
AC_MSG_CHECKING([for iconv() in separate -liconv ])
|
||||||
libburnia_liconv="no"
|
libburnia_liconv="no"
|
||||||
libburnia_save_LIBS="$LIBS"
|
libburnia_save_LIBS="$LIBS"
|
||||||
LIBS="$LIBS -liconv"
|
LIBS="$LIBS -liconv"
|
||||||
@ -65,6 +66,13 @@ AC_DEFUN([LIBBURNIA_CHECK_ICONV],
|
|||||||
)
|
)
|
||||||
AC_MSG_RESULT([$libburnia_liconv])
|
AC_MSG_RESULT([$libburnia_liconv])
|
||||||
|
|
||||||
|
if test x"$libburnia_save_LIBS" = x"$LIBS"
|
||||||
|
then
|
||||||
|
dnl GNU iconv has no function iconv() but libiconv() and a macro iconv()
|
||||||
|
dnl It is not tested whether this is detected by above macro.
|
||||||
|
AC_CHECK_LIB(iconv, libiconv, , )
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Check for iconv(..., const char **inbuf, ...)
|
dnl Check for iconv(..., const char **inbuf, ...)
|
||||||
AC_MSG_CHECKING([for const qualifier with iconv() ])
|
AC_MSG_CHECKING([for const qualifier with iconv() ])
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
@ -79,6 +87,50 @@ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, si
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl LIBBURNIA_ASSERT_ICONV is by Thomas Schmitt, libburnia project
|
||||||
|
dnl
|
||||||
|
AC_DEFUN([LIBBURNIA_ASSERT_ICONV],
|
||||||
|
[
|
||||||
|
if test x$LIBISOFS_ASSUME_ICONV = x
|
||||||
|
then
|
||||||
|
dnl Check for the essential gestures of libisofs/util.c
|
||||||
|
AC_MSG_CHECKING([for iconv() to be accessible now ])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <iconv.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <langinfo.h>
|
||||||
|
#include <unistd.h>],
|
||||||
|
[iconv_t cd = iconv_open("","");
|
||||||
|
iconv(cd,NULL,NULL,NULL,NULL);
|
||||||
|
iconv_close(cd);
|
||||||
|
], [iconv_test="yes"], [iconv_test="no"]
|
||||||
|
)
|
||||||
|
AC_MSG_RESULT([$iconv_test])
|
||||||
|
if test x$iconv_test = xno
|
||||||
|
then
|
||||||
|
echo >&2
|
||||||
|
echo "Cannot get function iconv() to work. Configuration aborted." >&2
|
||||||
|
echo "Check whether your system needs a separate libiconv installed." >&2
|
||||||
|
echo "If it is installed but not found, try something like" >&2
|
||||||
|
echo ' export LDFLAGS="$LDFLAGS -L/usr/local/lib"' >&2
|
||||||
|
echo ' export CPPFLAGS="$CPPFLAGS -I/usr/local/include"' >&2
|
||||||
|
echo ' export LIBS="$LIBS -liconv"' >&2
|
||||||
|
echo "You may override this test by exporting variable" >&2
|
||||||
|
echo " LIBISOFS_ASSUME_ICONV=yes" >&2
|
||||||
|
echo >&2
|
||||||
|
(exit 1); exit 1;
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
dnl LIBBURNIA_SET_PKGCONFIG determines the install directory for the *.pc file.
|
||||||
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
dnl Important: Must be performed _after_ TARGET_SHIZZLE
|
||||||
dnl
|
dnl
|
||||||
|
15
configure.ac
15
configure.ac
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libisofs], [0.6.28], [http://libburnia-project.org])
|
AC_INIT([libisofs], [0.6.30], [http://libburnia-project.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
|||||||
dnl
|
dnl
|
||||||
LIBISOFS_MAJOR_VERSION=0
|
LIBISOFS_MAJOR_VERSION=0
|
||||||
LIBISOFS_MINOR_VERSION=6
|
LIBISOFS_MINOR_VERSION=6
|
||||||
LIBISOFS_MICRO_VERSION=28
|
LIBISOFS_MICRO_VERSION=30
|
||||||
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)
|
||||||
@ -56,10 +56,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
|
||||||
# 2010.02.10 development jump has not yet happened
|
# 2010.04.17 development jump has not yet happened
|
||||||
# SONAME = 30 - 24 = 6 . Library name = libisofs.6.24.0
|
# SONAME = 32 - 26 = 6 . Library name = libisofs.6.26.0
|
||||||
LT_CURRENT=30
|
LT_CURRENT=32
|
||||||
LT_AGE=24
|
LT_AGE=26
|
||||||
LT_REVISION=0
|
LT_REVISION=0
|
||||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||||
|
|
||||||
@ -91,6 +91,9 @@ dnl If iconv(3) is in an extra lib, then it gets added to variable LIBS.
|
|||||||
dnl If not, then no -liconv will be added.
|
dnl If not, then no -liconv will be added.
|
||||||
LIBBURNIA_CHECK_ICONV
|
LIBBURNIA_CHECK_ICONV
|
||||||
|
|
||||||
|
dnl To abort configuration if iconv() still cannot be compiled
|
||||||
|
LIBBURNIA_ASSERT_ICONV
|
||||||
|
|
||||||
|
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
AC_SUBST(LIBTOOL_DEPS)
|
AC_SUBST(LIBTOOL_DEPS)
|
||||||
|
@ -305,3 +305,16 @@ The size of the volume is 2456606865 bytes, which have a MD5 sum of
|
|||||||
The checksum of "2_2 B00109.143415 2456606865 485bbef110870c45754d7adcc844a72c"
|
The checksum of "2_2 B00109.143415 2456606865 485bbef110870c45754d7adcc844a72c"
|
||||||
is c2355d5ea3c94d792ff5893dfe0d6d7b.
|
is c2355d5ea3c94d792ff5893dfe0d6d7b.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
This text is under
|
||||||
|
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
|
It shall only be modified in sync with libisofs and other software which
|
||||||
|
makes use of libisofs checksums. Please mail change requests to mailing list
|
||||||
|
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||||
|
Only if you cannot reach the copyright holder for at least one month it is
|
||||||
|
permissible to modify this text under the same license as the affected
|
||||||
|
copy of libisofs.
|
||||||
|
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||||
|
sync with the other interested users of this text.
|
||||||
|
|
||||||
|
@ -443,3 +443,14 @@ Program mkisofs emits entry XA
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
This text is under
|
||||||
|
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
|
It shall only be modified in sync with libisofs and other software which
|
||||||
|
makes use of AAIP. Please mail change requests to mailing list
|
||||||
|
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||||
|
Only if you cannot reach the copyright holder for at least one month it is
|
||||||
|
permissible to modify this text under the same license as the affected
|
||||||
|
copy of libisofs.
|
||||||
|
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||||
|
sync with the other interested users of this text.
|
||||||
|
|
||||||
|
@ -149,3 +149,14 @@ Registered:
|
|||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
This text is under
|
||||||
|
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
|
It shall only be modified in sync with libisofs and other software which
|
||||||
|
makes use of AAIP. Please mail change requests to mailing list
|
||||||
|
<libburn-hackers@pykix.org> or to the copyright holder in private.
|
||||||
|
Only if you cannot reach the copyright holder for at least one month it is
|
||||||
|
permissible to modify this text under the same license as the affected
|
||||||
|
copy of libisofs.
|
||||||
|
If you do so, you commit yourself to taking reasonable effort to stay in
|
||||||
|
sync with the other interested users of this text.
|
||||||
|
|
||||||
|
@ -141,3 +141,14 @@ SUSP 1.12
|
|||||||
RRIP 1.12
|
RRIP 1.12
|
||||||
ftp://ftp.ymi.com/pub/rockridge/rrip112.ps
|
ftp://ftp.ymi.com/pub/rockridge/rrip112.ps
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
This text is under
|
||||||
|
Copyright (c) 2009 - 2010 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
|
It shall reflect the effective technical specifications as implemented in
|
||||||
|
zisofs-tools and the Linux kernel. So please contact mailing list
|
||||||
|
<libburn-hackers@pykix.org> or to the copyright holder in private, if you
|
||||||
|
want to make changes.
|
||||||
|
Only if you cannot reach the copyright holder for at least one month it is
|
||||||
|
permissible to modify and distribute this text under the license "BSD revised".
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
To be included by aaip_0_2.c
|
To be included by aaip_0_2.c
|
||||||
|
|
||||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
aaip-os-freebsd.c
|
aaip-os-freebsd.c
|
||||||
Arbitrary Attribute Interchange Protocol , system adapter for getting and
|
Arbitrary Attribute Interchange Protocol , system adapter for getting and
|
||||||
setting of ACLs and ixattr.
|
setting of ACLs and xattr.
|
||||||
|
|
||||||
To be included by aaip_0_2.c
|
To be included by aaip_0_2.c
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
To be included by aaip_0_2.c
|
To be included by aaip_0_2.c
|
||||||
|
|
||||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
See test/aaip_0_2.h
|
See test/aaip_0_2.h
|
||||||
http://libburnia-project.org/wiki/AAIP
|
http://libburnia-project.org/wiki/AAIP
|
||||||
|
|
||||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -567,7 +567,7 @@ ex:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Linux man 5 acl says:
|
/* GNU/Linux man 5 acl says:
|
||||||
The permissions defined by ACLs are a superset of the permissions speci-
|
The permissions defined by ACLs are a superset of the permissions speci-
|
||||||
fied by the file permission bits. The permissions defined for the file
|
fied by the file permission bits. The permissions defined for the file
|
||||||
owner correspond to the permissions of the ACL_USER_OBJ entry. The per-
|
owner correspond to the permissions of the ACL_USER_OBJ entry. The per-
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
test/aaip_0_2.h - Public declarations
|
test/aaip_0_2.h - Public declarations
|
||||||
|
|
||||||
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2
|
Copyright (c) 2009 Thomas Schmitt, libburnia project, GPLv2+
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -73,6 +73,9 @@ void ecma119_image_free(Ecma119Image *t)
|
|||||||
if (t->output_charset != NULL)
|
if (t->output_charset != NULL)
|
||||||
free(t->output_charset);
|
free(t->output_charset);
|
||||||
|
|
||||||
|
if (t->system_area_data != NULL)
|
||||||
|
free(t->system_area_data);
|
||||||
|
|
||||||
#ifdef Libisofs_with_checksumS
|
#ifdef Libisofs_with_checksumS
|
||||||
if (t->checksum_ctx != NULL) { /* dispose checksum context */
|
if (t->checksum_ctx != NULL) { /* dispose checksum context */
|
||||||
char md5[16];
|
char md5[16];
|
||||||
@ -93,7 +96,7 @@ void ecma119_image_free(Ecma119Image *t)
|
|||||||
static
|
static
|
||||||
int need_version_number(Ecma119Image *t, Ecma119Node *n)
|
int need_version_number(Ecma119Image *t, Ecma119Node *n)
|
||||||
{
|
{
|
||||||
if (t->omit_version_numbers) {
|
if (t->omit_version_numbers & 1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER) {
|
if (n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER) {
|
||||||
@ -380,7 +383,7 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
|||||||
IsoImage *image;
|
IsoImage *image;
|
||||||
Ecma119Image *t;
|
Ecma119Image *t;
|
||||||
struct ecma119_pri_vol_desc vol;
|
struct ecma119_pri_vol_desc vol;
|
||||||
|
int i;
|
||||||
char *vol_id, *pub_id, *data_id, *volset_id;
|
char *vol_id, *pub_id, *data_id, *volset_id;
|
||||||
char *system_id, *application_id, *copyright_file_id;
|
char *system_id, *application_id, *copyright_file_id;
|
||||||
char *abstract_file_id, *biblio_file_id;
|
char *abstract_file_id, *biblio_file_id;
|
||||||
@ -435,9 +438,44 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
|||||||
strncpy_pad((char*)vol.abstract_file_id, abstract_file_id, 37);
|
strncpy_pad((char*)vol.abstract_file_id, abstract_file_id, 37);
|
||||||
strncpy_pad((char*)vol.bibliographic_file_id, biblio_file_id, 37);
|
strncpy_pad((char*)vol.bibliographic_file_id, biblio_file_id, 37);
|
||||||
|
|
||||||
iso_datetime_17(vol.vol_creation_time, t->now, t->always_gmt);
|
if (t->vol_uuid[0]) {
|
||||||
iso_datetime_17(vol.vol_modification_time, t->now, t->always_gmt);
|
for(i = 0; i < 16; i++)
|
||||||
iso_datetime_17(vol.vol_effective_time, t->now, t->always_gmt);
|
if(t->vol_uuid[i] < '0' || t->vol_uuid[i] > '9')
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
vol.vol_creation_time[i] = t->vol_uuid[i];
|
||||||
|
for(; i < 16; i++)
|
||||||
|
vol.vol_creation_time[i] = '1';
|
||||||
|
vol.vol_creation_time[16] = 0;
|
||||||
|
} else if (t->vol_creation_time > 0)
|
||||||
|
iso_datetime_17(vol.vol_creation_time, t->vol_creation_time,
|
||||||
|
t->always_gmt);
|
||||||
|
else
|
||||||
|
iso_datetime_17(vol.vol_creation_time, t->now, t->always_gmt);
|
||||||
|
|
||||||
|
if (t->vol_uuid[0]) {
|
||||||
|
for(i = 0; i < 16; i++)
|
||||||
|
if(t->vol_uuid[i] < '0' || t->vol_uuid[i] > '9')
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
vol.vol_modification_time[i] = t->vol_uuid[i];
|
||||||
|
for(; i < 16; i++)
|
||||||
|
vol.vol_modification_time[i] = '1';
|
||||||
|
vol.vol_modification_time[16] = 0;
|
||||||
|
} else if (t->vol_modification_time > 0)
|
||||||
|
iso_datetime_17(vol.vol_modification_time, t->vol_modification_time,
|
||||||
|
t->always_gmt);
|
||||||
|
else
|
||||||
|
iso_datetime_17(vol.vol_modification_time, t->now, t->always_gmt);
|
||||||
|
|
||||||
|
if (t->vol_expiration_time > 0)
|
||||||
|
iso_datetime_17(vol.vol_expiration_time, t->vol_expiration_time,
|
||||||
|
t->always_gmt);
|
||||||
|
|
||||||
|
if (t->vol_effective_time > 0)
|
||||||
|
iso_datetime_17(vol.vol_effective_time, t->vol_effective_time,
|
||||||
|
t->always_gmt);
|
||||||
|
|
||||||
vol.file_structure_version[0] = 1;
|
vol.file_structure_version[0] = 1;
|
||||||
|
|
||||||
free(vol_id);
|
free(vol_id);
|
||||||
@ -1065,7 +1103,9 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
{
|
{
|
||||||
int ret, i, voldesc_size, nwriters, image_checksums_mad = 0, tag_pos;
|
int ret, i, voldesc_size, nwriters, image_checksums_mad = 0, tag_pos;
|
||||||
Ecma119Image *target;
|
Ecma119Image *target;
|
||||||
int el_torito_writer_index = -1, file_src_writer_index= -1;
|
int el_torito_writer_index = -1, file_src_writer_index = -1;
|
||||||
|
int system_area_options = 0;
|
||||||
|
char *system_area = NULL;
|
||||||
|
|
||||||
/* 1. Allocate target and copy opts there */
|
/* 1. Allocate target and copy opts there */
|
||||||
target = calloc(1, sizeof(Ecma119Image));
|
target = calloc(1, sizeof(Ecma119Image));
|
||||||
@ -1127,6 +1167,30 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
target->eltorito = (src->bootcat == NULL ? 0 : 1);
|
target->eltorito = (src->bootcat == NULL ? 0 : 1);
|
||||||
target->catalog = src->bootcat;
|
target->catalog = src->bootcat;
|
||||||
|
|
||||||
|
if (opts->system_area_data != NULL) {
|
||||||
|
system_area = opts->system_area_data;
|
||||||
|
system_area_options = opts->system_area_options;
|
||||||
|
} else if (src->system_area_data != NULL) {
|
||||||
|
system_area = src->system_area_data;
|
||||||
|
system_area_options = src->system_area_options;
|
||||||
|
}
|
||||||
|
target->system_area_data = NULL;
|
||||||
|
if (system_area != NULL) {
|
||||||
|
target->system_area_data = calloc(32768, 1);
|
||||||
|
if (target->system_area_data == NULL) {
|
||||||
|
ret = ISO_OUT_OF_MEM;
|
||||||
|
goto target_cleanup;
|
||||||
|
}
|
||||||
|
memcpy(target->system_area_data, system_area, 32768);
|
||||||
|
}
|
||||||
|
target->system_area_options = system_area_options;
|
||||||
|
|
||||||
|
target->vol_creation_time = opts->vol_creation_time;
|
||||||
|
target->vol_modification_time = opts->vol_modification_time;
|
||||||
|
target->vol_expiration_time = opts->vol_expiration_time;
|
||||||
|
target->vol_effective_time = opts->vol_effective_time;
|
||||||
|
strcpy(target->vol_uuid, opts->vol_uuid);
|
||||||
|
|
||||||
target->input_charset = strdup(iso_get_local_charset(0));
|
target->input_charset = strdup(iso_get_local_charset(0));
|
||||||
if (target->input_charset == NULL) {
|
if (target->input_charset == NULL) {
|
||||||
ret = ISO_OUT_OF_MEM;
|
ret = ISO_OUT_OF_MEM;
|
||||||
@ -1689,6 +1753,14 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
|
|||||||
wopts->fifo_size = 1024; /* 2 MB buffer */
|
wopts->fifo_size = 1024; /* 2 MB buffer */
|
||||||
wopts->sort_files = 1; /* file sorting is always good */
|
wopts->sort_files = 1; /* file sorting is always good */
|
||||||
|
|
||||||
|
wopts->system_area_data = NULL;
|
||||||
|
wopts->system_area_options = 0;
|
||||||
|
wopts->vol_creation_time = 0;
|
||||||
|
wopts->vol_modification_time = 0;
|
||||||
|
wopts->vol_expiration_time = 0;
|
||||||
|
wopts->vol_effective_time = 0;
|
||||||
|
wopts->vol_uuid[0]= 0;
|
||||||
|
|
||||||
*opts = wopts;
|
*opts = wopts;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -1700,6 +1772,8 @@ void iso_write_opts_free(IsoWriteOpts *opts)
|
|||||||
}
|
}
|
||||||
|
|
||||||
free(opts->output_charset);
|
free(opts->output_charset);
|
||||||
|
if(opts->system_area_data != NULL)
|
||||||
|
free(opts->system_area_data);
|
||||||
free(opts);
|
free(opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1765,7 +1839,7 @@ int iso_write_opts_set_omit_version_numbers(IsoWriteOpts *opts, int omit)
|
|||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
opts->omit_version_numbers = omit ? 1 : 0;
|
opts->omit_version_numbers = omit & 3;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1801,7 +1875,7 @@ int iso_write_opts_set_no_force_dots(IsoWriteOpts *opts, int no)
|
|||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
opts->no_force_dots = no ? 1 : 0;
|
opts->no_force_dots = no & 3;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2085,3 +2159,43 @@ int iso_write_opts_get_data_start(IsoWriteOpts *opts, uint32_t *data_start,
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @param data Either NULL or 32 kB of data. Do not submit less bytes !
|
||||||
|
* @param options bit0 = apply GRUB protective msdos label
|
||||||
|
* @param flag bit0 = invalidate any attached system area data
|
||||||
|
* same as data == NULL
|
||||||
|
*/
|
||||||
|
int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
|
||||||
|
int options, int flag)
|
||||||
|
{
|
||||||
|
if (data == NULL || (flag & 1)) { /* Disable */
|
||||||
|
if (opts->system_area_data != NULL)
|
||||||
|
free(opts->system_area_data);
|
||||||
|
opts->system_area_data = NULL;
|
||||||
|
} else if (!(flag & 2)) {
|
||||||
|
if (opts->system_area_data == NULL) {
|
||||||
|
opts->system_area_data = calloc(32768, 1);
|
||||||
|
if (opts->system_area_data == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
}
|
||||||
|
memcpy(opts->system_area_data, data, 32768);
|
||||||
|
}
|
||||||
|
if (!(flag & 4))
|
||||||
|
opts->system_area_options = options & 3;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int iso_write_opts_set_pvd_times(IsoWriteOpts *opts,
|
||||||
|
time_t vol_creation_time, time_t vol_modification_time,
|
||||||
|
time_t vol_expiration_time, time_t vol_effective_time,
|
||||||
|
char *vol_uuid)
|
||||||
|
{
|
||||||
|
opts->vol_creation_time = vol_creation_time;
|
||||||
|
opts->vol_modification_time = vol_modification_time;
|
||||||
|
opts->vol_expiration_time = vol_expiration_time;
|
||||||
|
opts->vol_effective_time = vol_effective_time;
|
||||||
|
strncpy(opts->vol_uuid, vol_uuid, 16);
|
||||||
|
opts->vol_uuid[16] = 0;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -57,8 +57,10 @@ struct iso_write_opts {
|
|||||||
/**
|
/**
|
||||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||||
* Version numbers are usually not used.
|
* Version numbers are usually not used.
|
||||||
|
* bit0= ECMA-119 and Joliet (for historical reasons)
|
||||||
|
* bit1= Joliet
|
||||||
*/
|
*/
|
||||||
unsigned int omit_version_numbers :1;
|
unsigned int omit_version_numbers :2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
|
* Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
|
||||||
@ -82,8 +84,10 @@ struct iso_write_opts {
|
|||||||
* ISO-9660 forces filenames to have a ".", that separates file name from
|
* ISO-9660 forces filenames to have a ".", that separates file name from
|
||||||
* extension. libisofs adds it if original filename doesn't has one. Set
|
* extension. libisofs adds it if original filename doesn't has one. Set
|
||||||
* this to 1 to prevent this behavior
|
* this to 1 to prevent this behavior
|
||||||
|
* bit0= ECMA-119
|
||||||
|
* bit1= Joliet
|
||||||
*/
|
*/
|
||||||
unsigned int no_force_dots :1;
|
unsigned int no_force_dots :2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allow lowercase characters in ISO-9660 filenames. By default, only
|
* Allow lowercase characters in ISO-9660 filenames. By default, only
|
||||||
@ -298,6 +302,22 @@ struct iso_write_opts {
|
|||||||
*/
|
*/
|
||||||
char *scdbackup_tag_written;
|
char *scdbackup_tag_written;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See ecma119_image : System Area related information
|
||||||
|
*/
|
||||||
|
char *system_area_data;
|
||||||
|
int system_area_options;
|
||||||
|
|
||||||
|
/* User settable PVD time stamps */
|
||||||
|
time_t vol_creation_time;
|
||||||
|
time_t vol_modification_time;
|
||||||
|
time_t vol_expiration_time;
|
||||||
|
time_t vol_effective_time;
|
||||||
|
/* To eventually override vol_creation_time and vol_modification_time
|
||||||
|
* by unconverted string with timezone 0
|
||||||
|
*/
|
||||||
|
char vol_uuid[17];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ecma119_image Ecma119Image;
|
typedef struct ecma119_image Ecma119Image;
|
||||||
@ -328,11 +348,11 @@ struct ecma119_image
|
|||||||
unsigned int always_gmt :1;
|
unsigned int always_gmt :1;
|
||||||
|
|
||||||
/* relaxed constraints */
|
/* relaxed constraints */
|
||||||
unsigned int omit_version_numbers :1;
|
unsigned int omit_version_numbers :2;
|
||||||
unsigned int allow_deep_paths :1;
|
unsigned int allow_deep_paths :1;
|
||||||
unsigned int allow_longer_paths :1;
|
unsigned int allow_longer_paths :1;
|
||||||
unsigned int max_37_char_filenames :1;
|
unsigned int max_37_char_filenames :1;
|
||||||
unsigned int no_force_dots :1;
|
unsigned int no_force_dots :2;
|
||||||
unsigned int allow_lowercase :1;
|
unsigned int allow_lowercase :1;
|
||||||
unsigned int allow_full_ascii :1;
|
unsigned int allow_full_ascii :1;
|
||||||
|
|
||||||
@ -436,6 +456,25 @@ struct ecma119_image
|
|||||||
IsoFileSrc *cat; /**< location of the boot catalog in the new image */
|
IsoFileSrc *cat; /**< location of the boot catalog in the new image */
|
||||||
IsoFileSrc *bootimg; /**< location of the boot image in the new image */
|
IsoFileSrc *bootimg; /**< location of the boot image in the new image */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* System Area related information
|
||||||
|
*/
|
||||||
|
/* Content of an embedded boot image. Valid if not NULL.
|
||||||
|
* In that case it must point to a memory buffer at least 32 kB.
|
||||||
|
*/
|
||||||
|
char *system_area_data;
|
||||||
|
/*
|
||||||
|
* bit0= make bytes 446 - 512 of the system area a partition
|
||||||
|
* table which reserves partition 1 from byte 63*512 to the
|
||||||
|
* end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl.
|
||||||
|
* (GRUB protective msdos label.)
|
||||||
|
* This works with and without system_area_data.
|
||||||
|
* bit1= apply isohybrid MBR patching to the system area.
|
||||||
|
* This works only with system_area_data plus ISOLINUX boot image
|
||||||
|
* and only if not bit0 is set.
|
||||||
|
*/
|
||||||
|
int system_area_options;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Number of pad blocks that we need to write. Padding blocks are blocks
|
* Number of pad blocks that we need to write. Padding blocks are blocks
|
||||||
* filled by 0s that we put between the directory structures and the file
|
* filled by 0s that we put between the directory structures and the file
|
||||||
@ -492,6 +531,16 @@ struct ecma119_image
|
|||||||
/* writer thread descriptor */
|
/* writer thread descriptor */
|
||||||
pthread_t wthread;
|
pthread_t wthread;
|
||||||
pthread_attr_t th_attr;
|
pthread_attr_t th_attr;
|
||||||
|
|
||||||
|
/* User settable PVD time stamps */
|
||||||
|
time_t vol_creation_time;
|
||||||
|
time_t vol_modification_time;
|
||||||
|
time_t vol_expiration_time;
|
||||||
|
time_t vol_effective_time;
|
||||||
|
/* To eventually override vol_creation_time and vol_modification_time
|
||||||
|
* by unconverted string with timezone 0
|
||||||
|
*/
|
||||||
|
char vol_uuid[17];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BP(a,b) [(b) - (a) + 1]
|
#define BP(a,b) [(b) - (a) + 1]
|
||||||
|
@ -64,18 +64,18 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
|||||||
} else {
|
} else {
|
||||||
if (img->max_37_char_filenames) {
|
if (img->max_37_char_filenames) {
|
||||||
isoname = iso_r_fileid(ascii_name, 36, relaxed,
|
isoname = iso_r_fileid(ascii_name, 36, relaxed,
|
||||||
img->no_force_dots ? 0 : 1);
|
(img->no_force_dots & 1) ? 0 : 1);
|
||||||
} else if (img->iso_level == 1) {
|
} else if (img->iso_level == 1) {
|
||||||
if (relaxed) {
|
if (relaxed) {
|
||||||
isoname = iso_r_fileid(ascii_name, 11, relaxed,
|
isoname = iso_r_fileid(ascii_name, 11, relaxed,
|
||||||
img->no_force_dots ? 0 : 1);
|
(img->no_force_dots & 1) ? 0 : 1);
|
||||||
} else {
|
} else {
|
||||||
isoname = iso_1_fileid(ascii_name);
|
isoname = iso_1_fileid(ascii_name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (relaxed) {
|
if (relaxed) {
|
||||||
isoname = iso_r_fileid(ascii_name, 30, relaxed,
|
isoname = iso_r_fileid(ascii_name, 30, relaxed,
|
||||||
img->no_force_dots ? 0 : 1);
|
(img->no_force_dots & 1) ? 0 : 1);
|
||||||
} else {
|
} else {
|
||||||
isoname = iso_2_fileid(ascii_name);
|
isoname = iso_2_fileid(ascii_name);
|
||||||
}
|
}
|
||||||
|
@ -333,9 +333,11 @@ int create_image(IsoImage *image, const char *image_path,
|
|||||||
boot->image = (IsoFile*)imgfile;
|
boot->image = (IsoFile*)imgfile;
|
||||||
iso_node_ref(imgfile); /* get our ref */
|
iso_node_ref(imgfile); /* get our ref */
|
||||||
boot->bootable = 1;
|
boot->bootable = 1;
|
||||||
|
boot->isolinux_options = 0;
|
||||||
boot->type = boot_media_type;
|
boot->type = boot_media_type;
|
||||||
boot->load_size = load_sectors;
|
|
||||||
boot->partition_type = partition_type;
|
boot->partition_type = partition_type;
|
||||||
|
boot->load_seg = 0;
|
||||||
|
boot->load_size = load_sectors;
|
||||||
|
|
||||||
if (bootimg) {
|
if (bootimg) {
|
||||||
*bootimg = boot;
|
*bootimg = boot;
|
||||||
|
@ -39,7 +39,8 @@ struct el_torito_boot_image {
|
|||||||
/**
|
/**
|
||||||
* isolinux options
|
* isolinux options
|
||||||
* bit 0 -> whether to patch image
|
* bit 0 -> whether to patch image
|
||||||
* bit 1 -> whether to create isolinux image
|
* bit 1 -> whether to put built-in isolinux 3.72 isohybrid-MBR into image
|
||||||
|
* System Area (deprecated)
|
||||||
*/
|
*/
|
||||||
unsigned int isolinux_options:2;
|
unsigned int isolinux_options:2;
|
||||||
unsigned char type; /**< The type of image */
|
unsigned char type; /**< The type of image */
|
||||||
|
@ -102,6 +102,12 @@ struct iso_read_opts
|
|||||||
*/
|
*/
|
||||||
int auto_input_charset;
|
int auto_input_charset;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable loading of the first 32768 bytes of the session and
|
||||||
|
* submission by iso_write_opts_set_system_area(data, 0).
|
||||||
|
*/
|
||||||
|
int load_system_area;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2951,7 +2957,7 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
struct iso_read_opts *opts,
|
struct iso_read_opts *opts,
|
||||||
IsoReadImageFeatures **features)
|
IsoReadImageFeatures **features)
|
||||||
{
|
{
|
||||||
int ret, hflag;
|
int ret, hflag, i;
|
||||||
IsoImageFilesystem *fs;
|
IsoImageFilesystem *fs;
|
||||||
IsoFilesystem *fsback;
|
IsoFilesystem *fsback;
|
||||||
IsoNodeBuilder *blback;
|
IsoNodeBuilder *blback;
|
||||||
@ -2959,9 +2965,9 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
IsoFileSource *newroot;
|
IsoFileSource *newroot;
|
||||||
_ImageFsData *data;
|
_ImageFsData *data;
|
||||||
struct el_torito_boot_catalog *oldbootcat;
|
struct el_torito_boot_catalog *oldbootcat;
|
||||||
|
uint8_t *rpt;
|
||||||
|
|
||||||
#ifdef Libisofs_with_checksumS
|
#ifdef Libisofs_with_checksumS
|
||||||
int i;
|
|
||||||
uint32_t old_checksum_start_lba;
|
uint32_t old_checksum_start_lba;
|
||||||
uint32_t old_checksum_end_lba;
|
uint32_t old_checksum_end_lba;
|
||||||
uint32_t old_checksum_idx_count;
|
uint32_t old_checksum_idx_count;
|
||||||
@ -2969,7 +2975,6 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
char checksum_type[81];
|
char checksum_type[81];
|
||||||
uint32_t checksum_size;
|
uint32_t checksum_size;
|
||||||
size_t size;
|
size_t size;
|
||||||
uint8_t *rpt;
|
|
||||||
void *ctx = NULL;
|
void *ctx = NULL;
|
||||||
char md5[16];
|
char md5[16];
|
||||||
#endif
|
#endif
|
||||||
@ -2978,12 +2983,30 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
|
|||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ret = iso_image_filesystem_new(src, opts, image->id, &fs);
|
ret = iso_image_filesystem_new(src, opts, image->id, &fs);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
data = fs->data;
|
data = fs->data;
|
||||||
|
|
||||||
|
|
||||||
|
if (opts->load_system_area) {
|
||||||
|
if (image->system_area_data != NULL)
|
||||||
|
free(image->system_area_data);
|
||||||
|
image->system_area_data = calloc(32768, 1);
|
||||||
|
if (image->system_area_data == NULL)
|
||||||
|
return ISO_OUT_OF_MEM;
|
||||||
|
image->system_area_options = 0;
|
||||||
|
/* Read 32768 bytes */
|
||||||
|
for (i = 0; i < 16; i++) {
|
||||||
|
rpt = (uint8_t *) (image->system_area_data + i * 2048);
|
||||||
|
ret = src->read_block(src, opts->block + i, rpt);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* get root from filesystem */
|
/* get root from filesystem */
|
||||||
ret = fs->get_root(fs, &newroot);
|
ret = fs->get_root(fs, &newroot);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -3332,8 +3355,9 @@ int iso_read_opts_new(IsoReadOpts **opts, int profile)
|
|||||||
|
|
||||||
ropts->file_mode = 0444;
|
ropts->file_mode = 0444;
|
||||||
ropts->dir_mode = 0555;
|
ropts->dir_mode = 0555;
|
||||||
ropts->noaaip= 1;
|
ropts->noaaip = 1;
|
||||||
ropts->nomd5= 1;
|
ropts->nomd5 = 1;
|
||||||
|
ropts->load_system_area = 0;
|
||||||
|
|
||||||
*opts = ropts;
|
*opts = ropts;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
@ -3469,6 +3493,15 @@ int iso_read_opts_auto_input_charset(IsoReadOpts *opts, int mode)
|
|||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iso_read_opts_load_system_area(IsoReadOpts *opts, int mode)
|
||||||
|
{
|
||||||
|
if (opts == NULL) {
|
||||||
|
return ISO_NULL_POINTER;
|
||||||
|
}
|
||||||
|
opts->load_system_area = mode & 1;
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy an IsoReadImageFeatures object obtained with iso_image_import.
|
* Destroy an IsoReadImageFeatures object obtained with iso_image_import.
|
||||||
*/
|
*/
|
||||||
|
@ -74,6 +74,8 @@ 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);
|
||||||
}
|
}
|
||||||
|
img->system_area_data = NULL;
|
||||||
|
img->system_area_options = 0;
|
||||||
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;
|
||||||
@ -331,6 +333,16 @@ int iso_image_get_msg_id(IsoImage *image)
|
|||||||
return image->id;
|
return image->id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iso_image_get_system_area(IsoImage *img, char system_area_data[32768],
|
||||||
|
int *options, int flag)
|
||||||
|
{
|
||||||
|
*options = img->system_area_options;
|
||||||
|
if (img->system_area_data == NULL)
|
||||||
|
return 0;
|
||||||
|
memcpy(system_area_data, img->system_area_data, 32768);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int dir_update_size(IsoImage *image, IsoDir *dir)
|
int dir_update_size(IsoImage *image, IsoDir *dir)
|
||||||
{
|
{
|
||||||
|
@ -53,6 +53,11 @@ struct Iso_Image
|
|||||||
/* el-torito boot catalog */
|
/* el-torito boot catalog */
|
||||||
struct el_torito_boot_catalog *bootcat;
|
struct el_torito_boot_catalog *bootcat;
|
||||||
|
|
||||||
|
/* Eventually loaded system area data, or NULL */
|
||||||
|
char *system_area_data;
|
||||||
|
/* Prescribed/detected options, see iso_write_opts_set_system_area() */
|
||||||
|
int system_area_options;
|
||||||
|
|
||||||
/* image identifier, for message origin identifier */
|
/* image identifier, for message origin identifier */
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
|
|||||||
if (iso->type == LIBISO_DIR) {
|
if (iso->type == LIBISO_DIR) {
|
||||||
jname = iso_j_dir_id(ucs_name);
|
jname = iso_j_dir_id(ucs_name);
|
||||||
} else {
|
} else {
|
||||||
jname = iso_j_file_id(ucs_name);
|
jname = iso_j_file_id(ucs_name, !!(t->no_force_dots & 2));
|
||||||
}
|
}
|
||||||
free(ucs_name);
|
free(ucs_name);
|
||||||
if (jname != NULL) {
|
if (jname != NULL) {
|
||||||
@ -574,7 +574,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) {
|
if (n->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
||||||
/* take into account version numbers */
|
/* take into account version numbers */
|
||||||
ret += 4;
|
ret += 4;
|
||||||
}
|
}
|
||||||
@ -722,7 +722,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) {
|
if (node->type == JOLIET_FILE && !(t->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++] = ';';
|
||||||
@ -899,7 +899,7 @@ 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) {
|
if (child->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) {
|
||||||
len += 4;
|
len += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Applications must use 64 bit off_t, e.g. on 32-bit Linux by defining
|
* Applications must use 64 bit off_t, e.g. on 32-bit GNU/Linux by defining
|
||||||
* #define _LARGEFILE_SOURCE
|
* #define _LARGEFILE_SOURCE
|
||||||
* #define _FILE_OFFSET_BITS 64
|
* #define _FILE_OFFSET_BITS 64
|
||||||
* or take special precautions to interface with the library by 64 bit integers
|
* or take special precautions to interface with the library by 64 bit integers
|
||||||
@ -374,7 +374,7 @@ extern unsigned int iso_fs_global_id;
|
|||||||
* access and read file contents. Note that this doesn't need to be tied
|
* access and read file contents. Note that this doesn't need to be tied
|
||||||
* to the disc filesystem used in the partition being accessed. For example,
|
* to the disc filesystem used in the partition being accessed. For example,
|
||||||
* we have an IsoFilesystem implementation to access any mounted filesystem,
|
* we have an IsoFilesystem implementation to access any mounted filesystem,
|
||||||
* using standard Linux functions. It is also legal, of course, to implement
|
* using standard POSIX functions. It is also legal, of course, to implement
|
||||||
* an IsoFilesystem to deal with a specific filesystem over raw partitions.
|
* an IsoFilesystem to deal with a specific filesystem over raw partitions.
|
||||||
* That is what we do, for example, to access an ISO Image.
|
* That is what we do, for example, to access an ISO Image.
|
||||||
*
|
*
|
||||||
@ -1091,7 +1091,7 @@ int iso_lib_is_compatible(int major, int minor, int micro);
|
|||||||
*/
|
*/
|
||||||
#define iso_lib_header_version_major 0
|
#define iso_lib_header_version_major 0
|
||||||
#define iso_lib_header_version_minor 6
|
#define iso_lib_header_version_minor 6
|
||||||
#define iso_lib_header_version_micro 28
|
#define iso_lib_header_version_micro 30
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Usage discussion:
|
* Usage discussion:
|
||||||
@ -1286,7 +1286,9 @@ int iso_write_opts_set_aaip(IsoWriteOpts *opts, int enable);
|
|||||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||||
* This breaks ECMA-119 specification, but version numbers are usually not
|
* This breaks ECMA-119 specification, but version numbers are usually not
|
||||||
* used, so it should work on most systems. Use with caution.
|
* used, so it should work on most systems. Use with caution.
|
||||||
*
|
* @param omit
|
||||||
|
* bit0= omit version number with ECMA-119 and Joliet
|
||||||
|
* bit1= omit version number with Joliet alone (@since 0.6.30)
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
*/
|
*/
|
||||||
int iso_write_opts_set_omit_version_numbers(IsoWriteOpts *opts, int omit);
|
int iso_write_opts_set_omit_version_numbers(IsoWriteOpts *opts, int omit);
|
||||||
@ -1324,6 +1326,9 @@ int iso_write_opts_set_max_37_char_filenames(IsoWriteOpts *opts, int allow);
|
|||||||
* extension. libisofs adds it if original filename doesn't has one. Set
|
* extension. libisofs adds it if original filename doesn't has one. Set
|
||||||
* this to 1 to prevent this behavior.
|
* this to 1 to prevent this behavior.
|
||||||
* This breaks ECMA-119 specification. Use with caution.
|
* This breaks ECMA-119 specification. Use with caution.
|
||||||
|
* @param no
|
||||||
|
* bit0= no forced dot with ECMA-119
|
||||||
|
* bit1= no forced dot with Joliet (@since 0.6.30)
|
||||||
*
|
*
|
||||||
* @since 0.6.2
|
* @since 0.6.2
|
||||||
*/
|
*/
|
||||||
@ -1680,6 +1685,75 @@ 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);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
* system dependent boot software, e.g. a Master Boot Record which allows to
|
||||||
|
* boot from USB sticks or hard disks. ECMA-119 makes no own assumptions or
|
||||||
|
* prescriptions about the byte content.
|
||||||
|
*
|
||||||
|
* If system area data are given or options bit0 is set, then bit1 of
|
||||||
|
* el_torito_set_isolinux_options() is automatically disabled.
|
||||||
|
* @param data
|
||||||
|
* Either NULL or 32 kB of data. Do not submit less bytes !
|
||||||
|
* @param options
|
||||||
|
* Can cause manipulations of submitted data before they get written:
|
||||||
|
* bit0= apply a --protective-msdos-label as of grub-mkisofs.
|
||||||
|
* This means to patch bytes 446 to 512 of the system area so
|
||||||
|
* that one partition is defined which begins at the second
|
||||||
|
* 512-byte block of the image and ends where the image ends.
|
||||||
|
* This works with and without system_area_data.
|
||||||
|
* bit1= apply isohybrid MBR patching to the system area.
|
||||||
|
* This works only with system area data from SYSLINUX plus an
|
||||||
|
* ISOLINUX boot image (see iso_image_set_boot_image()) and
|
||||||
|
* only if not bit0 is set.
|
||||||
|
* @param flag
|
||||||
|
* bit0 = invalidate any attached system area data. Same as data == NULL
|
||||||
|
* (This re-activates eventually loaded image System Area data.
|
||||||
|
* To erase those, submit 32 kB of zeros without flag bit0.)
|
||||||
|
* bit1 = keep data unaltered
|
||||||
|
* bit2 = keep options unaltered
|
||||||
|
* @return
|
||||||
|
* ISO_SUCCESS or error
|
||||||
|
* @since 0.6.30
|
||||||
|
*/
|
||||||
|
int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
|
||||||
|
int options, int flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Explicitely set the four timestamps of the emerging Primary Volume
|
||||||
|
* Descriptor. Default with all parameters is 0.
|
||||||
|
* ECMA-119 defines them as:
|
||||||
|
* @param vol_creation_time
|
||||||
|
* When "the information in the volume was created."
|
||||||
|
* A value of 0 means that the timepoint of write start is to be used.
|
||||||
|
* @param vol_modification_time
|
||||||
|
* When "the information in the volume was last modified."
|
||||||
|
* A value of 0 means that the timepoint of write start is to be used.
|
||||||
|
* @param vol_expiration_time
|
||||||
|
* When "the information in the volume may be regarded as obsolete."
|
||||||
|
* A value of 0 means that the information never shall expire.
|
||||||
|
* @param vol_effective_time
|
||||||
|
* When "the information in the volume may be used."
|
||||||
|
* A value of 0 means that not such retention is intended.
|
||||||
|
* @param uuid
|
||||||
|
* If this text is not empty, then it overrides vol_creation_time and
|
||||||
|
* vol_modification_time by copying the first 16 decimal digits from
|
||||||
|
* uuid, eventually padding up with decimal '1', and writing a NUL-byte
|
||||||
|
* as timezone.
|
||||||
|
* Other than with vol_*_time the resulting string in the ISO image
|
||||||
|
* is fully predictable and free of timezone pitfalls.
|
||||||
|
* It should express a reasonable time in form YYYYMMDDhhmmsscc
|
||||||
|
* E.g.: "2010040711405800" = 7 Apr 2010 11:40:58 (+0 centiseconds)
|
||||||
|
*
|
||||||
|
* @since 0.6.30
|
||||||
|
*/
|
||||||
|
int iso_write_opts_set_pvd_times(IsoWriteOpts *opts,
|
||||||
|
time_t vol_creation_time, time_t vol_modification_time,
|
||||||
|
time_t vol_expiration_time, time_t vol_effective_time,
|
||||||
|
char *vol_uuid);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inquire the start address of the file data blocks after having used
|
* Inquire the start address of the file data blocks after having used
|
||||||
* IsoWriteOpts with iso_image_create_burn_source().
|
* IsoWriteOpts with iso_image_create_burn_source().
|
||||||
@ -1922,6 +1996,20 @@ int iso_read_opts_set_input_charset(IsoReadOpts *opts, const char *charset);
|
|||||||
*/
|
*/
|
||||||
int iso_read_opts_auto_input_charset(IsoReadOpts *opts, int mode);
|
int iso_read_opts_auto_input_charset(IsoReadOpts *opts, int mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable loading of the first 32768 bytes of the session.
|
||||||
|
*
|
||||||
|
* @param mode
|
||||||
|
* Bitfield for control purposes:
|
||||||
|
* bit0= Load System Area data and attach them to the image so that they
|
||||||
|
* get written by the next session, if not overridden by
|
||||||
|
* iso_write_opts_set_system_area().
|
||||||
|
* Submit any other bits with value 0.
|
||||||
|
*
|
||||||
|
* @since 0.6.30
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int iso_read_opts_load_system_area(IsoReadOpts *opts, int mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import a previous session or image, for growing or modify.
|
* Import a previous session or image, for growing or modify.
|
||||||
@ -2325,19 +2413,27 @@ void el_torito_set_no_bootable(ElToritoBootImage *bootimg);
|
|||||||
void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg);
|
void el_torito_patch_isolinux_image(ElToritoBootImage *bootimg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies options for IsoLinux boot images. This should only be used with
|
* Specifies options for ISOLINUX or GRUB boot images. This should only be used
|
||||||
* isolinux boot images.
|
* if the type of boot image is known.
|
||||||
*
|
*
|
||||||
* @param options
|
* @param options
|
||||||
* bitmask style flag. The following values are defined:
|
* bitmask style flag. The following values are defined:
|
||||||
*
|
*
|
||||||
* bit 0 -> 1 to patch the image, 0 to not
|
* bit 0 -> 1 to patch the boot info table of the boot image.
|
||||||
* Patching the image involves the writing of a 56 bytes
|
* 1 does the same as mkisofs option -boot-info-table.
|
||||||
* boot information table at offset 8 of the boot image file.
|
* Needed for ISOLINUX and for GRUB rescue boot images.
|
||||||
* The original boot image file will not be modified. This is
|
* The table is located at byte 8 of the boot image file.
|
||||||
* needed to allow isolinux images to be bootable.
|
* Its size is 56 bytes.
|
||||||
* bit 1 -> 1 to generate an hybrid image with MBR, 0 to not
|
* The original boot image file on disk will not be modified.
|
||||||
* An hybrid image is a boot image that boots from either
|
*
|
||||||
|
* bit 1 -> 1 to generate a ISOLINUX isohybrid image with MBR.
|
||||||
|
* ----------------------------------------------------------
|
||||||
|
* @deprecated since 31 Mar 2010:
|
||||||
|
* The author of syslinux, H. Peter Anvin requested that this
|
||||||
|
* feature shall not be used any more. He intends to cease
|
||||||
|
* support for the MBR template that is included in libisofs.
|
||||||
|
* ----------------------------------------------------------
|
||||||
|
* A hybrid image is a boot image that boots from either
|
||||||
* CD/DVD media or from disk-like media, e.g. USB stick.
|
* CD/DVD media or from disk-like media, e.g. USB stick.
|
||||||
* For that you need isolinux.bin from SYSLINUX 3.72 or later.
|
* For that you need isolinux.bin from SYSLINUX 3.72 or later.
|
||||||
* IMPORTANT: The application has to take care that the image
|
* IMPORTANT: The application has to take care that the image
|
||||||
@ -2350,6 +2446,28 @@ 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);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtain a copy of the eventually loaded first 32768 bytes of the imported
|
||||||
|
* session, the System Area.
|
||||||
|
* It will be written to the start of the next session unless it gets
|
||||||
|
* overwritten by iso_write_opts_set_system_area().
|
||||||
|
*
|
||||||
|
* @param img
|
||||||
|
* The image to be inquired.
|
||||||
|
* @param data
|
||||||
|
* A byte array of at least 32768 bytesi 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.
|
||||||
|
* @param flag
|
||||||
|
* Bitfield for control purposes, unused yet, submit 0
|
||||||
|
* @return
|
||||||
|
* 1 on success, 0 if no System Area was loaded, < 0 error.
|
||||||
|
* @since 0.6.30
|
||||||
|
*/
|
||||||
|
int iso_image_get_system_area(IsoImage *img, char data[32768],
|
||||||
|
int *options, int flag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments the reference counting of the given node.
|
* Increments the reference counting of the given node.
|
||||||
*
|
*
|
||||||
@ -2576,14 +2694,14 @@ time_t iso_node_get_ctime(const IsoNode *node);
|
|||||||
/**
|
/**
|
||||||
* Set if the node will be hidden in RR/ISO tree, Joliet tree or both.
|
* Set if the node will be hidden in RR/ISO tree, Joliet tree or both.
|
||||||
*
|
*
|
||||||
* If the file is set as hidden in one tree, it won't be included there, so
|
* If the file is set as hidden in one tree, it wil not be included there, so
|
||||||
* it won't be visible in a OS accessing CD using that tree. For example,
|
* it won't be visible in a OS accessing CD using that tree. For example,
|
||||||
* GNU/Linux systems access to Rock Ridge / ISO9960 tree in order to see
|
* GNU/Linux systems access to Rock Ridge / ISO9960 tree in order to see
|
||||||
* what is recorded on CD, while MS Windows make use of the Joliet tree. If a
|
* what is recorded on CD, while MS Windows make use of the Joliet tree. If a
|
||||||
* file is hidden only in Joliet, it won't be visible in Windows systems,
|
* file is hidden only in Joliet, it wil not be visible in Windows systems,
|
||||||
* while still visible in Linux.
|
* while still visible in GNU/Linux.
|
||||||
*
|
*
|
||||||
* If a file is hidden in both trees, it won't be written to image.
|
* If a file is hidden in both trees, it will not be written to image.
|
||||||
*
|
*
|
||||||
* @param node
|
* @param node
|
||||||
* The node that is to be hidden.
|
* The node that is to be hidden.
|
||||||
@ -4364,7 +4482,7 @@ int aaip_xinfo_func(void *data, int flag);
|
|||||||
* @param default_text
|
* @param default_text
|
||||||
* Will return a pointer to the eventual "default" ACL or NULL if it
|
* Will return a pointer to the eventual "default" ACL or NULL if it
|
||||||
* is not available.
|
* is not available.
|
||||||
* (Linux directories can have a "default" ACL which influences
|
* (GNU/Linux directories can have a "default" ACL which influences
|
||||||
* the permissions of newly created files.)
|
* the permissions of newly created files.)
|
||||||
* @param flag
|
* @param flag
|
||||||
* Bitfield for control purposes
|
* Bitfield for control purposes
|
||||||
@ -4401,7 +4519,7 @@ int iso_node_get_acl_text(IsoNode *node,
|
|||||||
* @param default_text
|
* @param default_text
|
||||||
* The text to be set into effect as "default" ACL. NULL will delete an
|
* The text to be set into effect as "default" ACL. NULL will delete an
|
||||||
* eventually existing "default" ACL of the node.
|
* eventually existing "default" ACL of the node.
|
||||||
* (Linux directories can have a "default" ACL which influences
|
* (GNU/Linux directories can have a "default" ACL which influences
|
||||||
* the permissions of newly created files.)
|
* the permissions of newly created files.)
|
||||||
* @param flag
|
* @param flag
|
||||||
* Bitfield for control purposes
|
* Bitfield for control purposes
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
/* for gettimeofday() */
|
/* for gettimeofday() */
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
|
||||||
/* This code stems from syslinux-3.72/utils/isohybrid, a perl script
|
/* This code stems from syslinux-3.72/utils/isohybrid, a perl script
|
||||||
under GPL which is Copyright 2002-2008 H. Peter Anvin.
|
under GPL which is Copyright 2002-2008 H. Peter Anvin.
|
||||||
|
|
||||||
@ -25,13 +26,13 @@ and is now under the licenses to which H.Peter Anvin agreed:
|
|||||||
or both, at your option.
|
or both, at your option.
|
||||||
Sincerely, H. Peter Anvin
|
Sincerely, H. Peter Anvin
|
||||||
|
|
||||||
In the context of xorriso-standalone, this code is under GPLv2 derived from
|
In the context of GNU xorriso, this code is under GPLv3+ derived from LGPL.
|
||||||
LGPL. In the context of libisofs this code derives its matching open source
|
In the context of libisofs this code derives its matching free software
|
||||||
license from above stem licenses, typically from LGPL.
|
license from above stem licenses, typically from LGPL.
|
||||||
In case its generosity is needed, here is the 2-clause BSD license:
|
In case its generosity is needed, here is the 2-clause BSD license:
|
||||||
|
|
||||||
make_isohybrid_mbr.c is copyright 2002-2008 H. Peter Anvin
|
make_isohybrid_mbr.c is copyright 2002-2008 H. Peter Anvin
|
||||||
and 2008-2009 libburnia project.
|
and 2008-2010 Thomas Schmitt
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice,
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
this list of conditions and the following disclaimer.
|
this list of conditions and the following disclaimer.
|
||||||
@ -51,8 +52,9 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* A helper function. One could replace it by one or two macros. */
|
/* A helper function. One could replace it by one or two macros. */
|
||||||
static int lsb_to_buf(char **wpt, int value, int bits, int flag)
|
static int lsb_to_buf(char **wpt, uint32_t value, int bits, int flag)
|
||||||
{
|
{
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
@ -61,6 +63,11 @@ static int lsb_to_buf(char **wpt, int value, int bits, int flag)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================================== */
|
||||||
|
/* Deprecated Function */
|
||||||
|
/* ====================================================================== */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
||||||
*
|
*
|
||||||
@ -228,3 +235,214 @@ int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag)
|
|||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ====================================================================== */
|
||||||
|
/* The New MBR Producer */
|
||||||
|
/* ====================================================================== */
|
||||||
|
|
||||||
|
/* The new MBR producer for isohybrid is a slightly generalized version of
|
||||||
|
the deprecated function make_isohybrid_mbr(). It complies to the urge
|
||||||
|
of H.Peter Anvin not to hardcode MBR templates but rather to read a
|
||||||
|
file from the Syslinux tree, and to patch it as was done with the old
|
||||||
|
MBR producer.
|
||||||
|
|
||||||
|
The old algorithm was clarified publicly by the following mail.
|
||||||
|
Changes towards the old algorithm:
|
||||||
|
- 512-byte LBA of boot image is extended to 64 bit (we stay with 32)
|
||||||
|
- check for a magic number is now gone
|
||||||
|
|
||||||
|
The new implementation tries to use similar terms as the mail in order
|
||||||
|
to facilitate its future discussion with Syslinux developers.
|
||||||
|
|
||||||
|
From hpa@zytor.com Thu Apr 1 08:32:52 2010
|
||||||
|
Date: Wed, 31 Mar 2010 14:53:51 -0700
|
||||||
|
From: H. Peter Anvin <hpa@zytor.com>
|
||||||
|
To: For discussion of Syslinux and tftp-hpa <syslinux@zytor.com>
|
||||||
|
Cc: Thomas Schmitt <scdbackup@gmx.net>
|
||||||
|
Subject: Re: [syslinux] port syslinux isohybrid perl script to C
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
[me:]
|
||||||
|
> Currently i lack of blob and prescriptions.
|
||||||
|
|
||||||
|
The blobs are available in the Syslinux build tree under the names:
|
||||||
|
|
||||||
|
mbr/isohdp[fp]x*.bin
|
||||||
|
|
||||||
|
The default probably should be mbr/isohdppx.bin, but it's ultimately up
|
||||||
|
to the user.
|
||||||
|
|
||||||
|
User definable parameters:
|
||||||
|
|
||||||
|
-> MBR ID (default random 32-bit number,
|
||||||
|
or preserved from previous instance)
|
||||||
|
-> Sector count (default 32, range 1-63)
|
||||||
|
-> Head count (default 64, range 1-256)
|
||||||
|
-> Partition offset (default 0, range 0-64)
|
||||||
|
-> Partition number (default 1, range 1-4)
|
||||||
|
-> Filesystem type (default 0x17, range 1-255)
|
||||||
|
|
||||||
|
Note: the filesystem type is largely arbitrary, in theory it can be any
|
||||||
|
value other than 0x00, 0x05, 0x0f, 0x85, 0xee, or 0xef. 0x17 ("Windows
|
||||||
|
IFS Hidden") seems safeish, some people believe 0x83 (Linux) is better.
|
||||||
|
|
||||||
|
Here is the prescriptions for how to install it:
|
||||||
|
|
||||||
|
All numbers are littleendian. "word" means 16 bits, "dword" means 32
|
||||||
|
bits, "qword" means 64 bits.
|
||||||
|
|
||||||
|
Common subroutine LBA_to_CHS():
|
||||||
|
s = (lba % sector_count) + 1
|
||||||
|
t = (lba / sector_count)
|
||||||
|
h = (t % head_count)
|
||||||
|
c = (t / head_count)
|
||||||
|
|
||||||
|
if (c >= 1024):
|
||||||
|
c = 1023
|
||||||
|
h = head_count
|
||||||
|
s = sector_count
|
||||||
|
|
||||||
|
s = s | ((c & 0x300) >> 2)
|
||||||
|
c = c & 0xff
|
||||||
|
|
||||||
|
write byte h
|
||||||
|
write byte s
|
||||||
|
write byte c
|
||||||
|
|
||||||
|
Main:
|
||||||
|
Pad image_size to a multiple of sector_count*head_count
|
||||||
|
Use the input file unmodified for bytes 0..431
|
||||||
|
write qword boot_lba # Offset 432
|
||||||
|
write dword mbr_id # Offset 440
|
||||||
|
write word 0 # Offset 444
|
||||||
|
|
||||||
|
# Offset 446
|
||||||
|
For each partition entry 1..4:
|
||||||
|
if this_partition != partition_number:
|
||||||
|
write 16 zero bytes
|
||||||
|
else:
|
||||||
|
write byte 0x80
|
||||||
|
write LBA_to_CHS(partition_offset)
|
||||||
|
write byte filesystem_type
|
||||||
|
write LBA_to_CHS(image_size-1)
|
||||||
|
write dword partition_offset
|
||||||
|
write dword image_size
|
||||||
|
|
||||||
|
# Offset 510
|
||||||
|
write word 0xaa55
|
||||||
|
|
||||||
|
Use the input file unmodified for bytes 512..32767
|
||||||
|
(pad with zero as necessary)
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
-hpa
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
int lba512chs_to_buf(char **wpt, off_t lba, int head_count, int sector_count)
|
||||||
|
{
|
||||||
|
int s, t, h, c;
|
||||||
|
|
||||||
|
s = (lba % sector_count) + 1;
|
||||||
|
t = (lba / sector_count);
|
||||||
|
h = (t % head_count);
|
||||||
|
c = (t / head_count);
|
||||||
|
if (c >= 1024) {
|
||||||
|
c = 1023;
|
||||||
|
h = head_count; /* >>> not -1 ? Limits head_count to 255 */
|
||||||
|
s = sector_count;
|
||||||
|
}
|
||||||
|
s = s | ((c & 0x300) >> 2);
|
||||||
|
c = c & 0xff;
|
||||||
|
(*((unsigned char **) wpt))[0] = h;
|
||||||
|
(*((unsigned char **) wpt))[1] = s;
|
||||||
|
(*((unsigned char **) wpt))[2] = c;
|
||||||
|
(*wpt)+= 3;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @param flag bit0= make own random MBR Id from current time
|
||||||
|
*/
|
||||||
|
int make_isolinux_mbr(int32_t *img_blocks, uint32_t boot_lba,
|
||||||
|
uint32_t mbr_id, int head_count, int sector_count,
|
||||||
|
int part_offset, int part_number, int fs_type,
|
||||||
|
uint8_t *buf, int flag)
|
||||||
|
{
|
||||||
|
uint32_t spc, id, part, nominal_part_size;
|
||||||
|
off_t hd_img_blocks, hd_boot_lba;
|
||||||
|
char *wpt;
|
||||||
|
/* For generating a weak random number */
|
||||||
|
struct timeval tv;
|
||||||
|
struct timezone tz;
|
||||||
|
|
||||||
|
/* Pad image_size to a multiple of sector_count*head_count
|
||||||
|
*/
|
||||||
|
spc = head_count * sector_count;
|
||||||
|
hd_img_blocks = ((off_t) *img_blocks) * (off_t) 4;
|
||||||
|
if (hd_img_blocks % spc) {
|
||||||
|
hd_img_blocks += spc - (hd_img_blocks % spc);
|
||||||
|
*img_blocks = hd_img_blocks / 4 + !!(hd_img_blocks % 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
wpt = (char *) buf + 432;
|
||||||
|
|
||||||
|
/* write qword boot_lba # Offset 432
|
||||||
|
*/
|
||||||
|
hd_boot_lba = ((off_t) boot_lba) * (off_t) 4;
|
||||||
|
lsb_to_buf(&wpt, hd_boot_lba & 0xffffffff, 32, 0);
|
||||||
|
lsb_to_buf(&wpt, hd_boot_lba >> 32, 32, 0);
|
||||||
|
|
||||||
|
/* write dword mbr_id # Offset 440
|
||||||
|
(here some 32-bit random value with no crypto strength)
|
||||||
|
*/
|
||||||
|
if (flag & 1) {
|
||||||
|
gettimeofday(&tv, &tz);
|
||||||
|
id = 0xffffffff & (tv.tv_sec ^ (tv.tv_usec * 2000));
|
||||||
|
lsb_to_buf(&wpt, id, 32, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write word 0 # Offset 444
|
||||||
|
*/
|
||||||
|
lsb_to_buf(&wpt, 0, 16, 0);
|
||||||
|
|
||||||
|
/* # Offset 446
|
||||||
|
*/
|
||||||
|
for (part = 1 ; part <= 4; part++) {
|
||||||
|
if (part != part_number) {
|
||||||
|
/* if this_partition != partition_number: write 16 zero bytes */
|
||||||
|
memset(wpt, 0, 16);
|
||||||
|
wpt+= 16;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* write byte 0x80
|
||||||
|
write LBA_to_CHS(partition_offset)
|
||||||
|
write byte filesystem_type
|
||||||
|
write LBA_to_CHS(image_size-1)
|
||||||
|
write dword partition_offset
|
||||||
|
write dword image_size
|
||||||
|
*/
|
||||||
|
lsb_to_buf(&wpt, 0x80, 8, 0);
|
||||||
|
lba512chs_to_buf(&wpt, part_offset, head_count, sector_count);
|
||||||
|
lsb_to_buf(&wpt, fs_type, 8, 0);
|
||||||
|
lba512chs_to_buf(&wpt, hd_img_blocks - 1, head_count, sector_count);
|
||||||
|
lsb_to_buf(&wpt, part_offset, 32, 0);
|
||||||
|
if (hd_img_blocks - (off_t) part_offset > (off_t) 0xffffffff)
|
||||||
|
nominal_part_size = 0xffffffff;
|
||||||
|
else
|
||||||
|
nominal_part_size = hd_img_blocks - (off_t) part_offset;
|
||||||
|
lsb_to_buf(&wpt, nominal_part_size, 32, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write word 0xaa55 # Offset 510
|
||||||
|
*/
|
||||||
|
lsb_to_buf(&wpt, 0xaa55, 16, 0);
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2008 Vreixo Formoso
|
* Copyright (c) 2008 Vreixo Formoso
|
||||||
|
* Copyright (c) 2010 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
|
||||||
@ -12,28 +13,114 @@
|
|||||||
#include "filesrc.h"
|
#include "filesrc.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
* Create a MBR for an isohybrid enabled ISOLINUX boot image.
|
||||||
*
|
* See libisofs/make_isohybrid_mbr.c
|
||||||
* It is assumed that the caller has verified the readiness of the boot image
|
* Deprecated.
|
||||||
* by checking for 0xfb 0xc0 0x78 0x70 at bytes 0x40 to 0x43 of isolinux.bin.
|
|
||||||
*
|
|
||||||
* @param bin_lba The predicted LBA of isolinux.bin within the emerging ISO.
|
|
||||||
* @param img_blocks The predicted number of 2048 byte blocks in the ISO.
|
|
||||||
* It will get rounded up to full MBs and that many blocks
|
|
||||||
* must really be written as ISO 9660 image.
|
|
||||||
* @param mbr A buffer of at least 512 bytes to take the result which is
|
|
||||||
* to be written as the very beginning of the ISO.
|
|
||||||
* @param flag unused yet, submit 0
|
|
||||||
* @return <0 = fatal, 0 = failed , 1 = ok , 2 = ok with size warning
|
|
||||||
*/
|
*/
|
||||||
int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
|
int make_isohybrid_mbr(int bin_lba, int *img_blocks, char *mbr, int flag);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The New ISOLINUX MBR Producer.
|
||||||
|
* Be cautious with changing parameters. Only few combinations are tested.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int make_isolinux_mbr(int32_t *img_blocks, uint32_t boot_lba,
|
||||||
|
uint32_t mbr_id, int head_count, int sector_count,
|
||||||
|
int part_offset, int part_number, int fs_type,
|
||||||
|
uint8_t *buf, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
/* This is the gesture of grub-mkisofs --protective-msdos-label as explained by
|
||||||
|
Vladimir Serbinenko <phcoder@gmail.com>, 2 April 2010, on grub-devel@gnu.org
|
||||||
|
"Currently we use first and not last entry. You need to:
|
||||||
|
1) Zero-fill 446-510
|
||||||
|
2) Put 0x55, 0xAA into 510-512
|
||||||
|
3) Put 0x80 (for bootable partition), 0, 2, 0 (C/H/S of the start), 0xcd
|
||||||
|
(partition type), [3 bytes of C/H/S end], 0x01, 0x00, 0x00, 0x00 (LBA
|
||||||
|
start in little endian), [LBA end in little endian] at 446-462
|
||||||
|
"
|
||||||
|
|
||||||
|
"C/H/S end" means the CHS address of the last block in the partition.
|
||||||
|
It seems that not "[LBA end in little endian]" but "number of blocks"
|
||||||
|
should go into bytes 458-461. But with a start lba of 1, this is the
|
||||||
|
same number.
|
||||||
|
See also http://en.wikipedia.org/wiki/Master_boot_record
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
int make_grub_msdos_label(int img_blocks, uint8_t *buf, int flag)
|
||||||
|
{
|
||||||
|
uint8_t *wpt;
|
||||||
|
unsigned long end_lba, secs, end_sec, end_head, end_cyl;
|
||||||
|
int sph = 63, hpc = 255, i;
|
||||||
|
|
||||||
|
/* Partition table unit is 512 bytes per sector, ECMA-119 unit is 2048 */
|
||||||
|
if (img_blocks >= 0x40000000)
|
||||||
|
img_blocks = 0x40000000 - 1; /* truncate rather than roll over */
|
||||||
|
secs = end_lba = img_blocks * 4 - 1; /* last valid 512-lba */
|
||||||
|
end_cyl = secs / (sph * hpc);
|
||||||
|
secs -= end_cyl * sph * hpc;
|
||||||
|
end_head = secs / sph;
|
||||||
|
end_sec = secs - end_head * sph + 1; /* Sector count starts by 1 */
|
||||||
|
if (end_cyl >= 1024) {
|
||||||
|
end_cyl = 1023;
|
||||||
|
end_head = hpc - 1;
|
||||||
|
end_sec = sph;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 1) Zero-fill 446-510 */
|
||||||
|
wpt = buf + 446;
|
||||||
|
memset(wpt, 0, 64);
|
||||||
|
|
||||||
|
/* 2) Put 0x55, 0xAA into 510-512 (actually 510-511) */
|
||||||
|
buf[510] = 0x55;
|
||||||
|
buf[511] = 0xAA;
|
||||||
|
|
||||||
|
/* 3) Put 0x80 (for bootable partition), */
|
||||||
|
*(wpt++) = 0x80;
|
||||||
|
|
||||||
|
/* 0, 2, 0 (C/H/S of the start), */
|
||||||
|
*(wpt++) = 0;
|
||||||
|
*(wpt++) = 2;
|
||||||
|
*(wpt++) = 0;
|
||||||
|
|
||||||
|
/* 0xcd (partition type) */
|
||||||
|
*(wpt++) = 0xcd;
|
||||||
|
|
||||||
|
/* [3 bytes of C/H/S end], */
|
||||||
|
*(wpt++) = end_head;
|
||||||
|
*(wpt++) = end_sec | ((end_cyl & 0x300) >> 2);
|
||||||
|
*(wpt++) = end_cyl & 0xff;
|
||||||
|
|
||||||
|
|
||||||
|
/* 0x01, 0x00, 0x00, 0x00 (LBA start in little endian), */
|
||||||
|
*(wpt++) = 0x01;
|
||||||
|
*(wpt++) = 0x00;
|
||||||
|
*(wpt++) = 0x00;
|
||||||
|
*(wpt++) = 0x00;
|
||||||
|
|
||||||
|
/* [LBA end in little endian] */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
*(wpt++) = (end_lba >> (8 * i)) & 0xff;
|
||||||
|
|
||||||
|
/* at 446-462 */
|
||||||
|
if (wpt - buf != 462) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"libisofs: program error in make_grub_msdos_label: \"assert 462\"\n");
|
||||||
|
return ISO_ASSERT_FAILURE;
|
||||||
|
}
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
int img_blocks;
|
||||||
|
|
||||||
if ((t == NULL) || (buf == NULL)) {
|
if ((t == NULL) || (buf == NULL)) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
@ -41,26 +128,41 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
|
|||||||
/* set buf to 0s */
|
/* set buf to 0s */
|
||||||
memset(buf, 0, 16 * BLOCK_SIZE);
|
memset(buf, 0, 16 * BLOCK_SIZE);
|
||||||
|
|
||||||
if (t->catalog != NULL && t->catalog->image->isolinux_options & 0x02) {
|
img_blocks = t->curblock;
|
||||||
/* We need to write a MBR for an hybrid image */
|
if (t->system_area_data != NULL) {
|
||||||
int ret;
|
/* Write more or less opaque boot image */
|
||||||
int img_blocks;
|
memcpy(buf, t->system_area_data, 16 * BLOCK_SIZE);
|
||||||
|
|
||||||
img_blocks = t->curblock;
|
|
||||||
ret = make_isohybrid_mbr(t->bootimg->sections[0].block, &img_blocks, (char*)buf, 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
API description of el_torito_set_isolinux_options() prescribes
|
|
||||||
to pad to full MB.
|
|
||||||
So this is not urgent any more :
|
|
||||||
|
|
||||||
// FIXME the new img_blocks size should be taken into account
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
} else if (t->catalog != NULL &&
|
||||||
|
(t->catalog->image->isolinux_options & 0x0a) == 0x02) {
|
||||||
|
/* Check for isolinux image with magic number of 3.72 and produce
|
||||||
|
an MBR from our built-in template. (Deprecated since 31 Mar 2010)
|
||||||
|
*/
|
||||||
|
ret = make_isohybrid_mbr(t->bootimg->sections[0].block,
|
||||||
|
&img_blocks, (char*)buf, 0);
|
||||||
if (ret != 1) {
|
if (ret != 1) {
|
||||||
/* error, it should never happen */
|
/* error, it should never happen */
|
||||||
return ISO_ASSERT_FAILURE;
|
return ISO_ASSERT_FAILURE;
|
||||||
}
|
}
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
if (t->system_area_options & 1) {
|
||||||
|
/* Write GRUB protective msdos label, i.e. a isimple partition table */
|
||||||
|
ret = make_grub_msdos_label(img_blocks, buf, 0);
|
||||||
|
if (ret != 1) /* error should never happen */
|
||||||
|
return ISO_ASSERT_FAILURE;
|
||||||
|
} else if(t->system_area_options & 2) {
|
||||||
|
/* Patch externally provided system area as isohybrid MBR */
|
||||||
|
if (t->catalog == NULL || t->system_area_data == NULL) {
|
||||||
|
/* isohybrid makes only sense together with ISOLINUX boot image
|
||||||
|
and externally provided System Area.
|
||||||
|
*/
|
||||||
|
return ISO_ISOLINUX_CANT_PATCH;
|
||||||
|
}
|
||||||
|
ret = make_isolinux_mbr(&img_blocks, t->bootimg->sections[0].block,
|
||||||
|
(uint32_t) 0, 64, 32, 0, 1, 0x17, buf, 1);
|
||||||
|
if (ret != 1)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -908,7 +908,10 @@ ex:;
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t *iso_j_file_id(const uint16_t *src)
|
/*
|
||||||
|
bit0= no_force_dots
|
||||||
|
*/
|
||||||
|
uint16_t *iso_j_file_id(const uint16_t *src, int flag)
|
||||||
{
|
{
|
||||||
uint16_t *dot;
|
uint16_t *dot;
|
||||||
size_t lname, lext, lnname, lnext, pos, i;
|
size_t lname, lext, lnname, lnext, pos, i;
|
||||||
@ -954,6 +957,10 @@ uint16_t *iso_j_file_id(const uint16_t *src)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((flag & 1) && lnext <= 0)
|
||||||
|
goto is_done;
|
||||||
|
|
||||||
set_ucsbe(dest + pos, '.');
|
set_ucsbe(dest + pos, '.');
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
@ -967,6 +974,8 @@ uint16_t *iso_j_file_id(const uint16_t *src)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_done:;
|
||||||
set_ucsbe(dest + pos, '\0');
|
set_ucsbe(dest + pos, '\0');
|
||||||
return ucsdup(dest);
|
return ucsdup(dest);
|
||||||
}
|
}
|
||||||
@ -1206,7 +1215,7 @@ void iso_datetime_7(unsigned char *buf, time_t t, int always_gmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset(&tm, 0, sizeof(tm));
|
memset(&tm, 0, sizeof(tm));
|
||||||
tm.tm_isdst = -1; /* some Linuxes change tm_isdst only if it is -1 */
|
tm.tm_isdst = -1; /* some OSes change tm_isdst only if it is -1 */
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
|
|
||||||
#ifdef HAVE_TM_GMTOFF
|
#ifdef HAVE_TM_GMTOFF
|
||||||
@ -1250,7 +1259,7 @@ void iso_datetime_17(unsigned char *buf, time_t t, int always_gmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
memset(&tm, 0, sizeof(tm));
|
memset(&tm, 0, sizeof(tm));
|
||||||
tm.tm_isdst = -1; /* some Linuxes change tm_isdst only if it is -1 */
|
tm.tm_isdst = -1; /* some OSes change tm_isdst only if it is -1 */
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
|
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&t, &tm);
|
||||||
|
@ -151,11 +151,12 @@ char *iso_r_fileid(const char *src, size_t len, int relaxed, int forcedot);
|
|||||||
* 2 bytes and the resulting string is NULL-terminated by a 2-byte NULL.
|
* 2 bytes and the resulting string is NULL-terminated by a 2-byte NULL.
|
||||||
*
|
*
|
||||||
* Note that version number and (;1) is not appended.
|
* Note that version number and (;1) is not appended.
|
||||||
*
|
* @param flag
|
||||||
|
* bit0= no_force_dots
|
||||||
* @return
|
* @return
|
||||||
* NULL if the original name and extension both are of length 0.
|
* NULL if the original name and extension both are of length 0.
|
||||||
*/
|
*/
|
||||||
uint16_t *iso_j_file_id(const uint16_t *src);
|
uint16_t *iso_j_file_id(const uint16_t *src, int flag);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Joliet directory identifier that consists of name and optionally
|
* Create a Joliet directory identifier that consists of name and optionally
|
||||||
|
Reference in New Issue
Block a user