Compare commits
12 Commits
release-0.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
35ceac65f7 | |||
45ffdef845 | |||
55d6ae343d | |||
a69f45e8cd | |||
68c3ae522e | |||
8e2748f23b | |||
f923a79929 | |||
362b15f4d5 | |||
2649045dfe | |||
3d427bdf70 | |||
8b2af3ac36 | |||
113358daea |
10
ChangeLog
10
ChangeLog
@ -1,7 +1,15 @@
|
||||
bzr branch lp:libisofs/for-libisoburn (to become libisofs-0.6.42.tar.gz)
|
||||
bzr branch lp:libisofs/for-libisoburn (to become libisofs-1.0.2.tar.gz)
|
||||
===============================================================================
|
||||
- no novelties yet
|
||||
|
||||
libisofs-1.0.0.tar.gz Mon Jan 17 2011
|
||||
===============================================================================
|
||||
* Bug fix: ECMA-119 directory names were truncated to 8 characters if
|
||||
lowercase characters or full ASCII are allowed.
|
||||
* New API call iso_write_opts_set_untranslated_name_len()
|
||||
* New API call iso_write_opts_set_allow_dir_id_ext()
|
||||
* New API call iso_memory_stream_new(). (Was formely a private call.)
|
||||
|
||||
libisofs-0.6.40.tar.gz Fri Dec 10 2010
|
||||
===============================================================================
|
||||
* New API call iso_write_opts_set_disc_label(), new system area type
|
||||
|
26
configure.ac
26
configure.ac
@ -1,4 +1,4 @@
|
||||
AC_INIT([libisofs], [0.6.40], [http://libburnia-project.org])
|
||||
AC_INIT([libisofs], [1.0.0], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
@ -38,9 +38,9 @@ dnl It rather feeds the API function iso_lib_version().
|
||||
dnl
|
||||
dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
|
||||
dnl
|
||||
LIBISOFS_MAJOR_VERSION=0
|
||||
LIBISOFS_MINOR_VERSION=6
|
||||
LIBISOFS_MICRO_VERSION=40
|
||||
LIBISOFS_MAJOR_VERSION=1
|
||||
LIBISOFS_MINOR_VERSION=0
|
||||
LIBISOFS_MICRO_VERSION=0
|
||||
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
|
||||
|
||||
AC_SUBST(LIBISOFS_MAJOR_VERSION)
|
||||
@ -50,10 +50,10 @@ AC_SUBST(LIBISOFS_VERSION)
|
||||
|
||||
dnl Libtool versioning
|
||||
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
|
||||
# 2010.12.10 development jump has not yet happened
|
||||
# SONAME = 42 - 36 = 6 . Library name = libisofs.6.36.0
|
||||
LT_CURRENT=42
|
||||
LT_AGE=36
|
||||
# 2011.01.16 development jump has not yet happened
|
||||
# SONAME = 44 - 38 = 6 . Library name = libisofs.6.38.0
|
||||
LT_CURRENT=44
|
||||
LT_AGE=38
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -133,15 +133,15 @@ AC_ARG_ENABLE(debug,
|
||||
, enable_debug=yes)
|
||||
if test x$enable_debug != xyes; then
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -O3"
|
||||
CFLAGS="$CFLAGS -fexpensive-optimizations"
|
||||
CFLAGS="-O3 $CFLAGS"
|
||||
CFLAGS="-fexpensive-optimizations $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DNDEBUG"
|
||||
CFLAGS="-DNDEBUG $CFLAGS"
|
||||
else
|
||||
if test x$GCC = xyes; then
|
||||
CFLAGS="$CFLAGS -g -pedantic -Wall"
|
||||
CFLAGS="-g -pedantic -Wall $CFLAGS"
|
||||
fi
|
||||
CFLAGS="$CFLAGS -DDEBUG"
|
||||
CFLAGS="-DDEBUG $CFLAGS"
|
||||
fi
|
||||
|
||||
dnl Verbose debug to make libisofs issue more debug messages
|
||||
|
@ -157,8 +157,8 @@ Byte Range | Value | Meaning
|
||||
| | "the number of virtual/emulated sectors the system
|
||||
| | will store at Load Segment during the initial boot
|
||||
| | procedure."
|
||||
| | libisofs stores 1 for emulated boot_media and
|
||||
| | 0 for boot_media == 0.
|
||||
| | libisofs stores 1 for emulated boot_media and a
|
||||
| | user defined value for boot_media == 0. Often: 4.
|
||||
| |
|
||||
8 - 11 | load_rba | Load RBA. The 2 kB block address where the boot
|
||||
| | image file content is located in the ISO 9660 image.
|
||||
@ -210,8 +210,8 @@ Byte Range | Value | Meaning
|
||||
| |
|
||||
6 - 7 | sec_count | Sector Count.
|
||||
| | See above Initial/Default Entry
|
||||
| | libisofs stores 1 for emulated boot_media and
|
||||
| | 0 for boot_media == 0.
|
||||
| | libisofs stores 1 for emulated boot_media and a
|
||||
| | user defined value for boot_media == 0. Often: 4.
|
||||
| |
|
||||
8 - 11 | load_rba | Load RBA. The 2 kB block address where the boot
|
||||
| | image file content is located in the ISO 9660 image.
|
||||
|
@ -141,7 +141,7 @@ static int show_chunk_to_jte(Ecma119Image *target, char *buf, int count)
|
||||
static
|
||||
int need_version_number(Ecma119Image *t, Ecma119Node *n)
|
||||
{
|
||||
if (t->omit_version_numbers & 1) {
|
||||
if ((t->omit_version_numbers & 1) || t->untranslated_name_len > 0) {
|
||||
return 0;
|
||||
}
|
||||
if (n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER) {
|
||||
@ -188,9 +188,9 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
||||
/* size of "." and ".." entries */
|
||||
len = 34 + 34;
|
||||
if (t->rockridge) {
|
||||
len += rrip_calc_len(t, dir, 1, 255 - 34, &ce_len);
|
||||
len += rrip_calc_len(t, dir, 1, 34, &ce_len);
|
||||
*ce += ce_len;
|
||||
len += rrip_calc_len(t, dir, 2, 255 - 34, &ce_len);
|
||||
len += rrip_calc_len(t, dir, 2, 34, &ce_len);
|
||||
*ce += ce_len;
|
||||
}
|
||||
|
||||
@ -203,7 +203,7 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
||||
for (section = 0; section < nsections; ++section) {
|
||||
size_t dirent_len = calc_dirent_len(t, child);
|
||||
if (t->rockridge) {
|
||||
dirent_len += rrip_calc_len(t, child, 0, 255 - dirent_len, &ce_len);
|
||||
dirent_len += rrip_calc_len(t, child, 0, dirent_len, &ce_len);
|
||||
*ce += ce_len;
|
||||
}
|
||||
remaining = BLOCK_SIZE - (len % BLOCK_SIZE);
|
||||
@ -594,7 +594,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
|
||||
|
||||
/* write the "." and ".." entries first */
|
||||
if (t->rockridge) {
|
||||
ret = rrip_get_susp_fields(t, dir, 1, 255 - 32, &info);
|
||||
ret = rrip_get_susp_fields(t, dir, 1, 34, &info);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -604,7 +604,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
|
||||
buf += len;
|
||||
|
||||
if (t->rockridge) {
|
||||
ret = rrip_get_susp_fields(t, dir, 2, 255 - 32, &info);
|
||||
ret = rrip_get_susp_fields(t, dir, 2, 34, &info);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -630,7 +630,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
|
||||
|
||||
/* get the SUSP fields if rockridge is enabled */
|
||||
if (t->rockridge) {
|
||||
ret = rrip_get_susp_fields(t, child, 0, 255 - len, &info);
|
||||
ret = rrip_get_susp_fields(t, child, 0, len, &info);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
@ -1575,6 +1575,8 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
||||
target->hardlinks = opts->hardlinks;
|
||||
target->aaip = opts->aaip;
|
||||
target->always_gmt = opts->always_gmt;
|
||||
target->untranslated_name_len = opts->untranslated_name_len;
|
||||
target->allow_dir_id_ext = opts->allow_dir_id_ext;
|
||||
target->omit_version_numbers = opts->omit_version_numbers
|
||||
| opts->max_37_char_filenames;
|
||||
target->allow_deep_paths = opts->allow_deep_paths;
|
||||
@ -2363,6 +2365,8 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
|
||||
wopts->appended_partitions[i] = NULL;
|
||||
wopts->ascii_disc_label[0] = 0;
|
||||
wopts->will_cancel = 0;
|
||||
wopts->allow_dir_id_ext = 0;
|
||||
wopts->untranslated_name_len = 0;
|
||||
|
||||
*opts = wopts;
|
||||
return ISO_SUCCESS;
|
||||
@ -2451,6 +2455,31 @@ int iso_write_opts_set_aaip(IsoWriteOpts *opts, int enable)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
int iso_write_opts_set_untranslated_name_len(IsoWriteOpts *opts, int len)
|
||||
{
|
||||
if (opts == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
if (len == -1)
|
||||
opts->untranslated_name_len = ISO_UNTRANSLATED_NAMES_MAX;
|
||||
else if(len == 0)
|
||||
opts->untranslated_name_len = 0;
|
||||
else if(len > ISO_UNTRANSLATED_NAMES_MAX || len < 0)
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
else
|
||||
opts->untranslated_name_len = len;
|
||||
return opts->untranslated_name_len;
|
||||
}
|
||||
|
||||
int iso_write_opts_set_allow_dir_id_ext(IsoWriteOpts *opts, int allow)
|
||||
{
|
||||
if (opts == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
opts->allow_dir_id_ext = allow ? 1 : 0;
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
int iso_write_opts_set_omit_version_numbers(IsoWriteOpts *opts, int omit)
|
||||
{
|
||||
if (opts == NULL) {
|
||||
|
@ -52,6 +52,17 @@
|
||||
#define ISO_DISC_LABEL_SIZE 129
|
||||
|
||||
|
||||
/* The maximum lenght of an specs violating ECMA-119 file identifier.
|
||||
The theoretical limit is 254 - 34 - 28 (len of SUSP CE entry) = 192
|
||||
Currently the practical limit is 254 - 34 - 96 (non-CE RR entries) - 28 (CE)
|
||||
*/
|
||||
#ifdef Libisofs_with_rrip_rR
|
||||
#define ISO_UNTRANSLATED_NAMES_MAX 92
|
||||
#else
|
||||
#define ISO_UNTRANSLATED_NAMES_MAX 96
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Holds the options for the image generation.
|
||||
*/
|
||||
@ -76,6 +87,14 @@ struct iso_write_opts {
|
||||
* but it is supposed to work on most moderns systems. Use with caution.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Convert directory names for ECMA-119 the same way as other file names
|
||||
* but do not force dots or add version numbers.
|
||||
* This violates ECMA-119 by allowing one "." and especially ISO level 1
|
||||
* by allowing DOS style 8.3 names rather than only 8 characters.
|
||||
*/
|
||||
unsigned int allow_dir_id_ext :1;
|
||||
|
||||
/**
|
||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||
* Version numbers are usually not used.
|
||||
@ -213,6 +232,21 @@ struct iso_write_opts {
|
||||
unsigned int replace_uid :2;
|
||||
unsigned int replace_gid :2;
|
||||
|
||||
/**
|
||||
* Extra Caution: This option breaks any assumptions about names that
|
||||
* are supported by ECMA-119 specifications.
|
||||
* Omit any translation which would make a file name compliant to the
|
||||
* ECMA-119 rules. This includes and exceeds omit_version_numbers,
|
||||
* max_37_char_filenames, no_force_dots bit0, allow_lowercase.
|
||||
* The maximum name length is given by this variable.
|
||||
* There is a length limit of ISO_UNTRANSLATED_NAMES_MAX characters,
|
||||
* because ECMA-119 allows 254 byte in a directory record, some
|
||||
* of them are occupied by ECMA-119, some more are needed for SUSP CE,
|
||||
* and some are fixely occupied by libisofs Rock Ridge code.
|
||||
* The default value 0 disables this feature.
|
||||
*/
|
||||
unsigned int untranslated_name_len;
|
||||
|
||||
mode_t dir_mode; /** Mode to use on dirs when replace_dir_mode == 2. */
|
||||
mode_t file_mode; /** Mode to use on files when replace_file_mode == 2. */
|
||||
uid_t uid; /** uid to use when replace_uid == 2. */
|
||||
@ -399,6 +433,7 @@ struct ecma119_image
|
||||
unsigned int always_gmt :1;
|
||||
|
||||
/* relaxed constraints */
|
||||
unsigned int allow_dir_id_ext :1;
|
||||
unsigned int omit_version_numbers :2;
|
||||
unsigned int allow_deep_paths :1;
|
||||
unsigned int allow_longer_paths :1;
|
||||
@ -437,6 +472,8 @@ struct ecma119_image
|
||||
unsigned int replace_dir_mode :1;
|
||||
unsigned int replace_timestamps :1;
|
||||
|
||||
unsigned int untranslated_name_len;
|
||||
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
mode_t file_mode;
|
||||
|
@ -12,6 +12,9 @@
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
/* Must be before ecma119.h because of eventual Libisofs_with_rrip_rR */
|
||||
#include "libisofs.h"
|
||||
|
||||
#include "ecma119_tree.h"
|
||||
#include "ecma119.h"
|
||||
#include "node.h"
|
||||
@ -29,7 +32,7 @@
|
||||
static
|
||||
int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||
{
|
||||
int ret, relaxed;
|
||||
int ret, relaxed, free_ascii_name= 0, force_dots = 0, max_len;
|
||||
char *ascii_name;
|
||||
char *isoname= NULL;
|
||||
|
||||
@ -38,9 +41,16 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||
return ISO_SUCCESS;
|
||||
}
|
||||
|
||||
ret = str2ascii(img->input_charset, iso->name, &ascii_name);
|
||||
if (img->untranslated_name_len > 0) {
|
||||
ascii_name = iso->name;
|
||||
ret = 1;
|
||||
} else {
|
||||
ret = str2ascii(img->input_charset, iso->name, &ascii_name);
|
||||
free_ascii_name = 1;
|
||||
}
|
||||
if (ret < 0) {
|
||||
iso_msg_submit(img->image->id, ret, 0, "Can't convert %s", iso->name);
|
||||
iso_msg_submit(img->image->id, ret, 0,
|
||||
"Cannot convert name '%s' to ASCII", iso->name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -49,8 +59,18 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||
} else {
|
||||
relaxed = (int)img->allow_lowercase;
|
||||
}
|
||||
if (iso->type == LIBISO_DIR) {
|
||||
if (img->max_37_char_filenames) {
|
||||
if (iso->type == LIBISO_DIR && !(img->allow_dir_id_ext)) {
|
||||
if (img->untranslated_name_len > 0) {
|
||||
if (strlen(ascii_name) > img->untranslated_name_len) {
|
||||
needs_transl:;
|
||||
iso_msg_submit(img->image->id, ISO_NAME_NEEDS_TRANSL, 0,
|
||||
"File name too long (%d > %d) for untranslated recording: '%s'",
|
||||
strlen(ascii_name), img->untranslated_name_len,
|
||||
ascii_name);
|
||||
return ISO_NAME_NEEDS_TRANSL;
|
||||
}
|
||||
isoname = strdup(ascii_name);
|
||||
} else if (img->max_37_char_filenames) {
|
||||
isoname = iso_r_dirid(ascii_name, 37, relaxed);
|
||||
} else if (img->iso_level == 1) {
|
||||
if (relaxed) {
|
||||
@ -60,32 +80,40 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
||||
}
|
||||
} else {
|
||||
if (relaxed) {
|
||||
isoname = iso_r_dirid(ascii_name, 8, relaxed);
|
||||
isoname = iso_r_dirid(ascii_name, 31, relaxed);
|
||||
} else {
|
||||
isoname = iso_2_dirid(ascii_name);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (img->max_37_char_filenames) {
|
||||
isoname = iso_r_fileid(ascii_name, 36, relaxed,
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
force_dots = !((img->no_force_dots & 1) || iso->type == LIBISO_DIR);
|
||||
if (img->untranslated_name_len > 0) {
|
||||
if (strlen(ascii_name) > img->untranslated_name_len)
|
||||
goto needs_transl;
|
||||
isoname = strdup(ascii_name);
|
||||
} else if (img->max_37_char_filenames) {
|
||||
isoname = iso_r_fileid(ascii_name, 36, relaxed, force_dots);
|
||||
} else if (img->iso_level == 1) {
|
||||
if (relaxed) {
|
||||
isoname = iso_r_fileid(ascii_name, 11, relaxed,
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
if (relaxed || !force_dots) {
|
||||
if (strchr(ascii_name, '.') == NULL)
|
||||
max_len = 8;
|
||||
else
|
||||
max_len = 11;
|
||||
isoname = iso_r_fileid(ascii_name, max_len, relaxed,
|
||||
force_dots);
|
||||
} else {
|
||||
isoname = iso_1_fileid(ascii_name);
|
||||
}
|
||||
} else {
|
||||
if (relaxed) {
|
||||
isoname = iso_r_fileid(ascii_name, 30, relaxed,
|
||||
(img->no_force_dots & 1) ? 0 : 1);
|
||||
if (relaxed || !force_dots) {
|
||||
isoname = iso_r_fileid(ascii_name, 30, relaxed, force_dots);
|
||||
} else {
|
||||
isoname = iso_2_fileid(ascii_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
free(ascii_name);
|
||||
if (free_ascii_name)
|
||||
free(ascii_name);
|
||||
if (isoname != NULL) {
|
||||
*name = isoname;
|
||||
return ISO_SUCCESS;
|
||||
@ -416,8 +444,6 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||
!!hidden);
|
||||
if (cret < 0) {
|
||||
/* error */
|
||||
if (!hidden)
|
||||
ecma119_node_free(node);
|
||||
ret = cret;
|
||||
break;
|
||||
} else if (cret == ISO_SUCCESS && !hidden) {
|
||||
@ -537,6 +563,18 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (img->untranslated_name_len) {
|
||||
/* This should not happen because no two IsoNode names should be
|
||||
identical and only unaltered IsoNode names should be seen here.
|
||||
Thus the Ema119Node names should be unique.
|
||||
*/
|
||||
iso_msg_submit(img->image->id, ISO_NAME_NEEDS_TRANSL, 0,
|
||||
"ECMA-119 file name collision: '%s'",
|
||||
children[i]->iso_name);
|
||||
ret = ISO_NAME_NEEDS_TRANSL;
|
||||
goto mangle_cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* A max of 7 characters is good enought, it allows handling up to
|
||||
* 9,999,999 files with same name. We can increment this to
|
||||
@ -553,10 +591,11 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
||||
|
||||
/* compute name and extension */
|
||||
dot = strrchr(full_name, '.');
|
||||
if (dot != NULL && children[i]->type != ECMA119_DIR) {
|
||||
if (dot != NULL &&
|
||||
(children[i]->type != ECMA119_DIR || img->allow_dir_id_ext)) {
|
||||
|
||||
/*
|
||||
* File (not dir) with extension
|
||||
* File (normally not dir) with extension
|
||||
* Note that we don't need to check for placeholders, as
|
||||
* tree reparent happens later, so no placeholders can be
|
||||
* here at this time.
|
||||
@ -596,10 +635,10 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
||||
name[max] = '\0';
|
||||
}
|
||||
} else {
|
||||
/* Directory, or file without extension */
|
||||
/* Directory (normally), or file without extension */
|
||||
if (children[i]->type == ECMA119_DIR) {
|
||||
max = max_dir_len - digits;
|
||||
dot = NULL; /* dots have no meaning in dirs */
|
||||
dot = NULL; /* dots (normally) have no meaning in dirs */
|
||||
} else {
|
||||
max = max_file_len - digits;
|
||||
}
|
||||
@ -716,7 +755,9 @@ int mangle_tree(Ecma119Image *img, int recurse)
|
||||
int max_file, max_dir;
|
||||
Ecma119Node *root;
|
||||
|
||||
if (img->max_37_char_filenames) {
|
||||
if (img->untranslated_name_len > 0) {
|
||||
max_file = max_dir = img->untranslated_name_len;
|
||||
} else if (img->max_37_char_filenames) {
|
||||
max_file = max_dir = 37;
|
||||
} else if (img->iso_level == 1) {
|
||||
max_file = 12; /* 8 + 3 + 1 */
|
||||
|
@ -12,8 +12,8 @@
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include "libisofs.h"
|
||||
#include "eltorito.h"
|
||||
#include "stream.h"
|
||||
#include "fsource.h"
|
||||
#include "filesrc.h"
|
||||
#include "image.h"
|
||||
|
@ -1120,9 +1120,9 @@ int iso_lib_is_compatible(int major, int minor, int micro);
|
||||
*
|
||||
* @since 0.6.2
|
||||
*/
|
||||
#define iso_lib_header_version_major 0
|
||||
#define iso_lib_header_version_minor 6
|
||||
#define iso_lib_header_version_micro 40
|
||||
#define iso_lib_header_version_major 1
|
||||
#define iso_lib_header_version_minor 0
|
||||
#define iso_lib_header_version_micro 0
|
||||
|
||||
/**
|
||||
* Usage discussion:
|
||||
@ -1344,6 +1344,50 @@ int iso_write_opts_set_hardlinks(IsoWriteOpts *opts, int enable);
|
||||
*/
|
||||
int iso_write_opts_set_aaip(IsoWriteOpts *opts, int enable);
|
||||
|
||||
/**
|
||||
* Caution: This option breaks any assumptions about names that
|
||||
* are supported by ECMA-119 specifications.
|
||||
* Try to omit any translation which would make a file name compliant to the
|
||||
* ECMA-119 rules. This includes and exceeds omit_version_numbers,
|
||||
* max_37_char_filenames, no_force_dots bit0, allow_full_ascii. Further it
|
||||
* prevents the conversion from local character set to ASCII.
|
||||
* The maximum name length is given by this call. If a filename exceeds
|
||||
* this length or cannot be recorded untranslated for other reasons, then
|
||||
* image production is aborted with ISO_NAME_NEEDS_TRANSL.
|
||||
* Currently the length limit is 96 characters, because an ECMA-119 directory
|
||||
* record may at most have 254 bytes and up to 158 other bytes must fit into
|
||||
* the record. Probably 96 more bytes can be made free for the name in future.
|
||||
* @param opts
|
||||
* The option set to be manipulated.
|
||||
* @param len
|
||||
* 0 = disable this feature and perform name translation according to
|
||||
* other settings.
|
||||
* >0 = Omit any translation. Eventually abort image production
|
||||
* if a name is longer than the given value.
|
||||
* -1 = Like >0. Allow maximum possible length (currently 96)
|
||||
* @return >=0 success, <0 failure
|
||||
* In case of >=0 the return value tells the effectively set len.
|
||||
* E.g. 96 after using len == -1.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
int iso_write_opts_set_untranslated_name_len(IsoWriteOpts *opts, int len);
|
||||
|
||||
/**
|
||||
* Convert directory names for ECMA-119 similar to other file names, but do
|
||||
* not force a dot or add a version number.
|
||||
* This violates ECMA-119 by allowing one "." and especially ISO level 1
|
||||
* by allowing DOS style 8.3 names rather than only 8 characters.
|
||||
* (mkisofs and its clones seem to do this violation.)
|
||||
* @param opts
|
||||
* The option set to be manipulated.
|
||||
* @param allow
|
||||
* 1= allow dots , 0= disallow dots and convert them
|
||||
* @return
|
||||
* 1 success, < 0 error
|
||||
* @since 1.0.0
|
||||
*/
|
||||
int iso_write_opts_set_allow_dir_id_ext(IsoWriteOpts *opts, int allow);
|
||||
|
||||
/**
|
||||
* Omit the version number (";1") at the end of the ISO-9660 identifiers.
|
||||
* This breaks ECMA-119 specification, but version numbers are usually not
|
||||
@ -3982,6 +4026,24 @@ int iso_tree_add_new_dir(IsoDir *parent, const char *name, IsoDir **dir);
|
||||
int iso_tree_add_new_file(IsoDir *parent, const char *name, IsoStream *stream,
|
||||
IsoFile **file);
|
||||
|
||||
/**
|
||||
* Create an IsoStream object from content which is stored in a dynamically
|
||||
* allocated memory buffer. The new stream will become owner of the buffer
|
||||
* and apply free() to it when the stream finally gets destroyed itself.
|
||||
*
|
||||
* @param buf
|
||||
* The dynamically allocated memory buffer with the stream content.
|
||||
* @parm size
|
||||
* The number of bytes which may be read from buf.
|
||||
* @param stream
|
||||
* Will return a reference to the newly created stream.
|
||||
* @return
|
||||
* ISO_SUCCESS or <0 for error. E.g. ISO_NULL_POINTER, ISO_OUT_OF_MEM.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
int iso_memory_stream_new(unsigned char *buf, size_t size, IsoStream **stream);
|
||||
|
||||
/**
|
||||
* Add a new symlink to the directory tree. Permissions are set to 0777,
|
||||
* owner and hidden atts are taken from parent. You can modify any of them
|
||||
@ -6422,6 +6484,9 @@ int iso_md5_match(char first_md5[16], char second_md5[16]);
|
||||
/** Displacement offset leads outside 32 bit range (FAILURE, HIGH, -372) */
|
||||
#define ISO_DISPLACE_ROLLOVER 0xE830FE8C
|
||||
|
||||
/** File name cannot be written into ECMA-119 untranslated
|
||||
(FAILURE, HIGH, -373) */
|
||||
#define ISO_NAME_NEEDS_TRANSL 0xE830FE8B
|
||||
|
||||
|
||||
/* Internal developer note:
|
||||
|
@ -133,6 +133,7 @@ iso_md5_compute;
|
||||
iso_md5_end;
|
||||
iso_md5_match;
|
||||
iso_md5_start;
|
||||
iso_memory_stream_new;
|
||||
iso_msgs_submit;
|
||||
iso_new_find_conditions_and;
|
||||
iso_new_find_conditions_atime;
|
||||
@ -255,6 +256,7 @@ iso_write_opts_new;
|
||||
iso_write_opts_set_aaip;
|
||||
iso_write_opts_set_aaip_susp_1_10;
|
||||
iso_write_opts_set_allow_deep_paths;
|
||||
iso_write_opts_set_allow_dir_id_ext;
|
||||
iso_write_opts_set_allow_full_ascii;
|
||||
iso_write_opts_set_allow_longer_paths;
|
||||
iso_write_opts_set_allow_lowercase;
|
||||
@ -293,6 +295,7 @@ iso_write_opts_set_scdbackup_tag;
|
||||
iso_write_opts_set_sort_files;
|
||||
iso_write_opts_set_system_area;
|
||||
iso_write_opts_set_tail_blocks;
|
||||
iso_write_opts_set_untranslated_name_len;
|
||||
iso_write_opts_set_will_cancel;
|
||||
iso_zisofs_get_params;
|
||||
iso_zisofs_get_refcounts;
|
||||
|
@ -361,6 +361,8 @@ const char *iso_error_to_msg(int errcode)
|
||||
return "May not combine appended partition with non-MBR system area";
|
||||
case ISO_DISPLACE_ROLLOVER:
|
||||
return "Displacement offset leads outside 32 bit range";
|
||||
case ISO_NAME_NEEDS_TRANSL:
|
||||
return "File name cannot be written into ECMA-119 untranslated";
|
||||
default:
|
||||
return "Unknown error";
|
||||
}
|
||||
|
@ -13,6 +13,9 @@
|
||||
#include "../config.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "rockridge.h"
|
||||
#include "node.h"
|
||||
#include "ecma119_tree.h"
|
||||
@ -22,7 +25,12 @@
|
||||
#include "aaip_0_2.h"
|
||||
#include "libisofs.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef Libisofs_with_rrip_rR
|
||||
#define ISO_ROCKRIDGE_IN_DIR_REC 128
|
||||
#else
|
||||
#define ISO_ROCKRIDGE_IN_DIR_REC 124
|
||||
#endif
|
||||
|
||||
|
||||
static
|
||||
@ -1104,27 +1112,30 @@ unannounced_ca:;
|
||||
* @param type
|
||||
* 0 normal entry, 1 "." entry for that node (it is a dir), 2 ".."
|
||||
* for that node (i.e., it will refer to the parent)
|
||||
* @param space
|
||||
* Available space in the System Use Area for the directory record.
|
||||
* @param used_up
|
||||
* Already occupied space in the directory record.
|
||||
* @param ce
|
||||
* Will be filled with the space needed in a CE
|
||||
* @return
|
||||
* The size needed for the RR entries in the System Use Area
|
||||
*/
|
||||
size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t space,
|
||||
size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
|
||||
size_t *ce)
|
||||
{
|
||||
size_t su_size;
|
||||
size_t su_size, space;
|
||||
int ret;
|
||||
|
||||
/* space min is 255 - 33 - 37 = 185
|
||||
* At the same time, it is always an odd number, but we need to pad it
|
||||
* propertly to ensure the length of a directory record is a even number
|
||||
* (ECMA-119, 9.1.13). Thus, in fact the real space is always space - 1
|
||||
*/
|
||||
space--;
|
||||
*ce = 0;
|
||||
/* Directory record length must be even (ECMA-119, 9.1.13). Maximum is 254.
|
||||
*/
|
||||
space = 254 - used_up - (used_up % 2);
|
||||
if (type < 0 || type > 2 || space < ISO_ROCKRIDGE_IN_DIR_REC) {
|
||||
iso_msg_submit(t->image->id, ISO_ASSERT_FAILURE, 0,
|
||||
"Unknown node type %d or short RR space %d < %d in directory record",
|
||||
type, (int) space, ISO_ROCKRIDGE_IN_DIR_REC);
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
*ce = 0;
|
||||
su_size = 0;
|
||||
|
||||
/* If AAIP enabled and announced by ER : account for 5 bytes of ES */;
|
||||
@ -1268,8 +1279,8 @@ int add_aa_string(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
|
||||
* @param type
|
||||
* 0 normal entry, 1 "." entry for that node (it is a dir), 2 ".."
|
||||
* for that node (i.e., it will refer to the parent)
|
||||
* @param space
|
||||
* Available space in the System Use Area for the directory record.
|
||||
* @param used_up
|
||||
* Already occupied space in the directory record.
|
||||
* @param info
|
||||
* Pointer to the struct susp_info where the entries will be stored.
|
||||
* If some entries need to go to a Continuation Area, they will be added
|
||||
@ -1279,7 +1290,7 @@ int add_aa_string(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
|
||||
* 1 success, < 0 error
|
||||
*/
|
||||
int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
||||
size_t space, struct susp_info *info)
|
||||
size_t used_up, struct susp_info *info)
|
||||
{
|
||||
int ret;
|
||||
size_t i;
|
||||
@ -1291,13 +1302,20 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
||||
size_t su_size_pd, ce_len_pd; /* predicted sizes of SUA and CA */
|
||||
int ce_is_predicted = 0;
|
||||
size_t aaip_sua_free= 0, aaip_len= 0;
|
||||
size_t space;
|
||||
|
||||
if (t == NULL || n == NULL || info == NULL) {
|
||||
return ISO_NULL_POINTER;
|
||||
}
|
||||
if (type < 0 || type > 2 || space < 185) {
|
||||
/* space min is 255 - 33 - 37 = 185 */
|
||||
return ISO_WRONG_ARG_VALUE;
|
||||
|
||||
/* Directory record length must be even (ECMA-119, 9.1.13). Maximum is 254.
|
||||
*/
|
||||
space = 254 - used_up - (used_up % 2);
|
||||
if (type < 0 || type > 2 || space < ISO_ROCKRIDGE_IN_DIR_REC) {
|
||||
iso_msg_submit(t->image->id, ISO_ASSERT_FAILURE, 0,
|
||||
"Unknown node type %d or short RR space %d < %d in directory record",
|
||||
type, (int) space, ISO_ROCKRIDGE_IN_DIR_REC);
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
if (type == 2 && n->parent != NULL) {
|
||||
@ -1306,13 +1324,6 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
||||
node = n;
|
||||
}
|
||||
|
||||
/* space min is 255 - 33 - 37 = 185
|
||||
* At the same time, it is always an odd number, but we need to pad it
|
||||
* propertly to ensure the length of a directory record is a even number
|
||||
* (ECMA-119, 9.1.13). Thus, in fact the real space is always space - 1
|
||||
*/
|
||||
space--;
|
||||
|
||||
/*
|
||||
* SP must be the first entry for the "." record of the root directory
|
||||
* (SUSP, 5.3)
|
||||
@ -1384,6 +1395,13 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
|
||||
}
|
||||
}
|
||||
|
||||
if (info->suf_len + 28 > space) {
|
||||
iso_msg_submit(t->image->id, ISO_ASSERT_FAILURE, 0,
|
||||
"Directory Record overflow. name='%s' , suf_len=%d > space=%d - 28\n",
|
||||
node->iso_name, (int) info->suf_len, (int) space);
|
||||
return ISO_ASSERT_FAILURE;
|
||||
}
|
||||
|
||||
if (type == 0) {
|
||||
size_t sua_free; /* free space in the SUA */
|
||||
int nm_type = 0; /* 0 whole entry in SUA, 1 part in CE */
|
||||
|
@ -55,15 +55,6 @@ int iso_file_source_stream_new(IsoFileSource *src, IsoStream **stream);
|
||||
int iso_cut_out_stream_new(IsoFileSource *src, off_t offset, off_t size,
|
||||
IsoStream **stream);
|
||||
|
||||
/**
|
||||
* Create a stream for reading from a arbitrary memory buffer.
|
||||
* When the Stream refcount reach 0, the buffer is free(3).
|
||||
*
|
||||
* @return
|
||||
* 1 sucess, < 0 error
|
||||
*/
|
||||
int iso_memory_stream_new(unsigned char *buf, size_t size, IsoStream **stream);
|
||||
|
||||
/**
|
||||
* Obtain eventual zisofs ZF field entry parameters from a file source out
|
||||
* of a loaded ISO image.
|
||||
|
@ -773,6 +773,8 @@ char *iso_r_dirid(const char *src, int size, int relaxed)
|
||||
len = size;
|
||||
}
|
||||
dest = malloc(len + 1);
|
||||
if (dest == NULL)
|
||||
return NULL;
|
||||
for (i = 0; i < len; i++) {
|
||||
char c= src[i];
|
||||
if (relaxed == 2) {
|
||||
@ -1036,6 +1038,8 @@ uint16_t *ucsdup(const uint16_t *str)
|
||||
size_t len = ucslen(str);
|
||||
|
||||
ret = malloc(2 * (len + 1));
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
if (ret != NULL) {
|
||||
memcpy(ret, str, 2 * (len + 1));
|
||||
}
|
||||
@ -1460,6 +1464,8 @@ char *ucs2str(const char *buf, size_t len)
|
||||
|
||||
/* ensure enought space */
|
||||
out = calloc(outbytes, 1);
|
||||
if (out == NULL)
|
||||
return NULL;
|
||||
|
||||
/* convert to local charset */
|
||||
conv_ret = iso_iconv_open(&conv, iso_get_local_charset(0), "UCS-2BE", 0);
|
||||
|
Reference in New Issue
Block a user