Compare commits

..

6 Commits

11 changed files with 155 additions and 57 deletions

View File

@ -1,3 +1,10 @@
libisofs-1.2.8.tar.gz Mon Mar 18 2013
===============================================================================
* New API call iso_image_get_pvd_times().
* Bug fix: Image size prediction altered the pointers to MD5 of data files
which stem from a previous session.
* Bug fix: Reading damaged Rock Ridge data could cause SIGSEGV by NULL.
libisofs-1.2.6.tar.gz Tue Jan 08 2013 libisofs-1.2.6.tar.gz Tue Jan 08 2013
=============================================================================== ===============================================================================
* Bug fix: Appended partitions did not obey cylinder alignment * Bug fix: Appended partitions did not obey cylinder alignment

View File

@ -1,4 +1,4 @@
AC_INIT([libisofs], [1.2.6], [http://libburnia-project.org]) AC_INIT([libisofs], [1.2.8], [http://libburnia-project.org])
AC_PREREQ([2.50]) AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h]) dnl AC_CONFIG_HEADER([config.h])
@ -41,7 +41,7 @@ dnl If LIBISOFS_*_VERSION changes, be sure to change AC_INIT above to match.
dnl dnl
LIBISOFS_MAJOR_VERSION=1 LIBISOFS_MAJOR_VERSION=1
LIBISOFS_MINOR_VERSION=2 LIBISOFS_MINOR_VERSION=2
LIBISOFS_MICRO_VERSION=6 LIBISOFS_MICRO_VERSION=8
LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION LIBISOFS_VERSION=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION.$LIBISOFS_MICRO_VERSION
AC_SUBST(LIBISOFS_MAJOR_VERSION) AC_SUBST(LIBISOFS_MAJOR_VERSION)
@ -51,10 +51,10 @@ AC_SUBST(LIBISOFS_VERSION)
dnl Libtool versioning dnl Libtool versioning
LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION LT_RELEASE=$LIBISOFS_MAJOR_VERSION.$LIBISOFS_MINOR_VERSION
# 2013.01.08 development jump has not yet happened # 2013.03.18 development jump has not yet happened
# SONAME = 68 - 62 = 6 . Library name = libisofs.6.62.0 # SONAME = 70 - 64 = 6 . Library name = libisofs.6.64.0
LT_CURRENT=68 LT_CURRENT=70
LT_AGE=62 LT_AGE=64
LT_REVISION=0 LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`

View File

@ -1,7 +1,7 @@
/* /*
* Copyright (c) 2007 Vreixo Formoso * Copyright (c) 2007 Vreixo Formoso
* Copyright (c) 2007 Mario Danic * Copyright (c) 2007 Mario Danic
* Copyright (c) 2009 - 2012 Thomas Schmitt * Copyright (c) 2009 - 2013 Thomas Schmitt
* *
* This file is part of the libisofs project; you can redistribute it and/or * This file is part of the libisofs project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2 * modify it under the terms of the GNU General Public License version 2
@ -1613,6 +1613,7 @@ int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
*/; */;
} else if (ret == 1 && img->checksum_array == NULL) { } else if (ret == 1 && img->checksum_array == NULL) {
/* No checksum array loaded. Delete "isofs.cx" */ /* No checksum array loaded. Delete "isofs.cx" */
if (!target->will_cancel)
iso_node_set_attrs(node, (size_t) 1, iso_node_set_attrs(node, (size_t) 1,
&cx_names, cx_value_lengths, &cx_valuept, 4 | 8); &cx_names, cx_value_lengths, &cx_valuept, 4 | 8);
no_md5 = 1; no_md5 = 1;
@ -1639,8 +1640,9 @@ int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
} }
/* Equip nodes with provisory isofs.cx numbers: 4 byte, all 0. /* Equip nodes with provisory isofs.cx numbers: 4 byte, all 0.
Omit those from old image which will not be copied and have no MD5. Omit those from old image which will not be copied and have no MD5.
Do not alter the nodes if this is only a will_cancel run.
*/ */
if (!no_md5) { if (!(target->will_cancel || no_md5)) {
ret = iso_file_set_isofscx(file, (unsigned int) 0, 0); ret = iso_file_set_isofscx(file, (unsigned int) 0, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;

View File

@ -127,7 +127,7 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
/* insert the filesrc in the tree */ /* insert the filesrc in the tree */
ret = iso_rbtree_insert(img->files, fsrc, (void**)src); ret = iso_rbtree_insert(img->files, fsrc, (void**)src);
if (ret <= 0) { if (ret <= 0) {
if (ret == 0 && (*src)->checksum_index > 0) { if (ret == 0 && (*src)->checksum_index > 0 && !img->will_cancel) {
/* Duplicate file source was mapped to previously registered source /* Duplicate file source was mapped to previously registered source
*/ */
cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0); cret = iso_file_set_isofscx(file, (*src)->checksum_index, 0);
@ -152,7 +152,7 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
no_md5 = 1; no_md5 = 1;
} }
if ((img->md5_file_checksums & 1) && !no_md5) { if ((img->md5_file_checksums & 1) && !(no_md5 || img->will_cancel)) {
img->checksum_idx_counter++; img->checksum_idx_counter++;
if (img->checksum_idx_counter < 0x7fffffff) { if (img->checksum_idx_counter < 0x7fffffff) {
fsrc->checksum_index = img->checksum_idx_counter; fsrc->checksum_index = img->checksum_idx_counter;

View File

@ -241,6 +241,10 @@ typedef struct
char *copyright_file_id; char *copyright_file_id;
char *abstract_file_id; char *abstract_file_id;
char *biblio_file_id; char *biblio_file_id;
char *creation_time;
char *modification_time;
char *expiration_time;
char *effective_time;
/* extension information */ /* extension information */
@ -2089,6 +2093,10 @@ void ifs_fs_free(IsoFilesystem *fs)
free(data->copyright_file_id); free(data->copyright_file_id);
free(data->abstract_file_id); free(data->abstract_file_id);
free(data->biblio_file_id); free(data->biblio_file_id);
free(data->creation_time);
free(data->modification_time);
free(data->expiration_time);
free(data->effective_time);
free(data->input_charset); free(data->input_charset);
free(data->local_charset); free(data->local_charset);
@ -2318,6 +2326,14 @@ int read_pvm(_ImageFsData *data, uint32_t block)
data->abstract_file_id[0] = 0; data->abstract_file_id[0] = 0;
data->biblio_file_id[0] = 0; data->biblio_file_id[0] = 0;
} }
data->creation_time =
iso_util_strcopy_untail((char*) pvm->vol_creation_time, 17);
data->modification_time =
iso_util_strcopy_untail((char*) pvm->vol_modification_time, 17);
data->expiration_time =
iso_util_strcopy_untail((char*) pvm->vol_expiration_time, 17);
data->effective_time =
iso_util_strcopy_untail((char*) pvm->vol_effective_time, 17);
data->nblocks = iso_read_bb(pvm->vol_space_size, 4, NULL); data->nblocks = iso_read_bb(pvm->vol_space_size, 4, NULL);
@ -2857,9 +2873,9 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
{ {
int ret, idx, to_copy; int ret, idx, to_copy;
struct stat info; struct stat info;
IsoNode *new; IsoNode *new = NULL;
IsoBoot *bootcat; IsoBoot *bootcat;
char *name; char *name = NULL;
char *dest = NULL; char *dest = NULL;
ImageFileSourceData *data; ImageFileSourceData *data;
_ImageFsData *fsdata; _ImageFsData *fsdata;
@ -2887,7 +2903,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
goto ex; goto ex;
} }
new = NULL;
switch (info.st_mode & S_IFMT) { switch (info.st_mode & S_IFMT) {
case S_IFREG: case S_IFREG:
{ {
@ -2901,9 +2916,8 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
"More than one catalog node has been found. " "More than one catalog node has been found. "
"We can continue, but that could lead to " "We can continue, but that could lead to "
"problems"); "problems");
if (ret < 0) { if (ret < 0)
goto ex; goto ex;
}
iso_node_unref((IsoNode*)image->bootcat->node); iso_node_unref((IsoNode*)image->bootcat->node);
} }
@ -2911,9 +2925,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
* a regular file */ * a regular file */
new = calloc(1, sizeof(IsoBoot)); new = calloc(1, sizeof(IsoBoot));
if (new == NULL) { if (new == NULL) {
ret = ISO_OUT_OF_MEM; ret = ISO_OUT_OF_MEM; goto ex;
free(name);
goto ex;
} }
bootcat = (IsoBoot *) new; bootcat = (IsoBoot *) new;
bootcat->lba = data->sections[0].block; bootcat->lba = data->sections[0].block;
@ -2924,10 +2936,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
if (bootcat->size > 0) { if (bootcat->size > 0) {
bootcat->content = calloc(1, bootcat->size); bootcat->content = calloc(1, bootcat->size);
if (bootcat->content == NULL) { if (bootcat->content == NULL) {
ret = ISO_OUT_OF_MEM; ret = ISO_OUT_OF_MEM; goto ex;
free(name);
free(new);
goto ex;
} }
to_copy = bootcat->size; to_copy = bootcat->size;
if (bootcat->size > fsdata->catsize) if (bootcat->size > fsdata->catsize)
@ -2944,16 +2953,14 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
IsoFile *file; IsoFile *file;
ret = iso_file_source_stream_new(src, &stream); ret = iso_file_source_stream_new(src, &stream);
if (ret < 0) { if (ret < 0)
free(name);
goto ex; goto ex;
}
/* take a ref to the src, as stream has taken our ref */ /* take a ref to the src, as stream has taken our ref */
iso_file_source_ref(src); iso_file_source_ref(src);
file = calloc(1, sizeof(IsoFile)); file = calloc(1, sizeof(IsoFile));
if (file == NULL) { if (file == NULL) {
free(name);
iso_stream_unref(stream); iso_stream_unref(stream);
{ret = ISO_OUT_OF_MEM; goto ex;} {ret = ISO_OUT_OF_MEM; goto ex;}
} }
@ -2977,7 +2984,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
data->block_size_log2, data->block_size_log2,
data->uncompressed_size, 0); data->uncompressed_size, 0);
if (ret < 0) { if (ret < 0) {
free(name);
iso_stream_unref(stream); iso_stream_unref(stream);
goto ex; goto ex;
} }
@ -3008,7 +3014,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0, ret = iso_msg_submit(image->id, ISO_EL_TORITO_WARN, 0,
"More than one ISO node has been found for the same boot image."); "More than one ISO node has been found for the same boot image.");
if (ret < 0) { if (ret < 0) {
free(name);
iso_stream_unref(stream); iso_stream_unref(stream);
goto ex; goto ex;
} }
@ -3026,7 +3031,6 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
/* source is a directory */ /* source is a directory */
new = calloc(1, sizeof(IsoDir)); new = calloc(1, sizeof(IsoDir));
if (new == NULL) { if (new == NULL) {
free(name);
{ret = ISO_OUT_OF_MEM; goto ex;} {ret = ISO_OUT_OF_MEM; goto ex;}
} }
new->type = LIBISO_DIR; new->type = LIBISO_DIR;
@ -3042,12 +3046,10 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
ret = iso_file_source_readlink(src, dest, LIBISOFS_NODE_PATH_MAX); ret = iso_file_source_readlink(src, dest, LIBISOFS_NODE_PATH_MAX);
if (ret < 0) { if (ret < 0) {
free(name);
goto ex; goto ex;
} }
link = calloc(1, sizeof(IsoSymlink)); link = calloc(1, sizeof(IsoSymlink));
if (link == NULL) { if (link == NULL) {
free(name);
{ret = ISO_OUT_OF_MEM; goto ex;} {ret = ISO_OUT_OF_MEM; goto ex;}
} }
link->dest = strdup(dest); link->dest = strdup(dest);
@ -3068,8 +3070,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
IsoSpecial *special; IsoSpecial *special;
special = calloc(1, sizeof(IsoSpecial)); special = calloc(1, sizeof(IsoSpecial));
if (special == NULL) { if (special == NULL) {
free(name); ret = ISO_OUT_OF_MEM; goto ex;
{ret = ISO_OUT_OF_MEM; goto ex;}
} }
special->dev = info.st_rdev; special->dev = info.st_rdev;
special->node.type = LIBISO_SPECIAL; special->node.type = LIBISO_SPECIAL;
@ -3080,11 +3081,12 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
new->refcount = 0; new->refcount = 0;
} }
break; break;
default:
ret = ISO_BAD_ISO_FILETYPE; goto ex;
} }
/* fill fields */ /* fill fields */
new->refcount++; new->refcount++;
new->name = name; new->name = name; name = NULL;
new->mode = info.st_mode; new->mode = info.st_mode;
new->uid = info.st_uid; new->uid = info.st_uid;
new->gid = info.st_gid; new->gid = info.st_gid;
@ -3099,7 +3101,7 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
ret = src_aa_to_node(src, new, 0); ret = src_aa_to_node(src, new, 0);
if (ret < 0) { if (ret < 0) {
goto failure; goto ex;
} }
/* Attach ino as xinfo if valid and no IsoStream is involved */ /* Attach ino as xinfo if valid and no IsoStream is involved */
@ -3107,18 +3109,17 @@ int image_builder_create_node(IsoNodeBuilder *builder, IsoImage *image,
!fsdata->make_new_ino) { !fsdata->make_new_ino) {
ret = iso_node_set_ino(new, info.st_ino, 0); ret = iso_node_set_ino(new, info.st_ino, 0);
if (ret < 0) if (ret < 0)
goto failure; goto ex;
} }
*node = new; *node = new; new = NULL;
{ret = ISO_SUCCESS; goto ex;} {ret = ISO_SUCCESS; goto ex;}
failure:; ex:;
/* todo: stuff any possible memory leak here */
if (name != NULL) if (name != NULL)
free(name); free(name);
free(new); if (new != NULL)
ex:; iso_node_unref(new);
LIBISO_FREE_MEM(dest); LIBISO_FREE_MEM(dest);
return ret; return ret;
} }
@ -3568,6 +3569,8 @@ int iso_image_import(IsoImage *image, IsoDataSource *src,
iso_image_set_copyright_file_id(image, data->copyright_file_id); iso_image_set_copyright_file_id(image, data->copyright_file_id);
iso_image_set_abstract_file_id(image, data->abstract_file_id); iso_image_set_abstract_file_id(image, data->abstract_file_id);
iso_image_set_biblio_file_id(image, data->biblio_file_id); iso_image_set_biblio_file_id(image, data->biblio_file_id);
iso_image_set_pvd_times(image, data->creation_time,
data->modification_time, data->expiration_time, data->effective_time);
if (features != NULL) { if (features != NULL) {
*features = malloc(sizeof(IsoReadImageFeatures)); *features = malloc(sizeof(IsoReadImageFeatures));

View File

@ -145,6 +145,10 @@ void iso_image_unref(IsoImage *image)
free(image->copyright_file_id); free(image->copyright_file_id);
free(image->abstract_file_id); free(image->abstract_file_id);
free(image->biblio_file_id); free(image->biblio_file_id);
free(image->creation_time);
free(image->modification_time);
free(image->expiration_time);
free(image->effective_time);
if (image->used_inodes != NULL) if (image->used_inodes != NULL)
free(image->used_inodes); free(image->used_inodes);
if (image->system_area_data != NULL) if (image->system_area_data != NULL)
@ -335,6 +339,37 @@ const char *iso_image_get_biblio_file_id(const IsoImage *image)
return image->biblio_file_id; return image->biblio_file_id;
} }
int iso_image_set_pvd_times(IsoImage *image,
char *creation_time, char *modification_time,
char *expiration_time, char *effective_time)
{
if (creation_time == NULL || modification_time == NULL ||
expiration_time == NULL || effective_time == NULL)
return ISO_NULL_POINTER;
image->creation_time = strdup(creation_time);
image->modification_time = strdup(modification_time);
image->expiration_time = strdup(expiration_time);
image->effective_time = strdup(effective_time);
if (image->creation_time == NULL || image->modification_time == NULL ||
image->expiration_time == NULL || image->effective_time == NULL)
return ISO_OUT_OF_MEM;
return ISO_SUCCESS;
}
int iso_image_get_pvd_times(IsoImage *image,
char **creation_time, char **modification_time,
char **expiration_time, char **effective_time)
{
if (image->creation_time == NULL || image->modification_time == NULL ||
image->expiration_time == NULL || image->effective_time == NULL)
return ISO_NULL_POINTER;
*creation_time = image->creation_time;
*modification_time = image->modification_time;
*expiration_time = image->expiration_time;
*effective_time = image->effective_time;
return ISO_SUCCESS;
}
int iso_image_get_msg_id(IsoImage *image) int iso_image_get_msg_id(IsoImage *image)
{ {
return image->id; return image->id;

View File

@ -49,6 +49,10 @@ struct Iso_Image
char *copyright_file_id; char *copyright_file_id;
char *abstract_file_id; char *abstract_file_id;
char *biblio_file_id; char *biblio_file_id;
char *creation_time;
char *modification_time;
char *expiration_time;
char *effective_time;
/* el-torito boot catalog */ /* el-torito boot catalog */
struct el_torito_boot_catalog *bootcat; struct el_torito_boot_catalog *bootcat;
@ -234,4 +238,8 @@ int iso_image_set_checksums(IsoImage *image, char *checksum_array,
uint32_t idx_count, int flag); uint32_t idx_count, int flag);
int iso_image_set_pvd_times(IsoImage *image,
char *creation_time, char *modification_time,
char *expiration_time, char *effective_time);
#endif /*LIBISO_IMAGE_H_*/ #endif /*LIBISO_IMAGE_H_*/

View File

@ -84,7 +84,7 @@
*/ */
#define iso_lib_header_version_major 1 #define iso_lib_header_version_major 1
#define iso_lib_header_version_minor 2 #define iso_lib_header_version_minor 2
#define iso_lib_header_version_micro 6 #define iso_lib_header_version_micro 8
/** /**
* Get version of the libisofs library at runtime. * Get version of the libisofs library at runtime.
@ -3027,6 +3027,36 @@ void iso_image_set_biblio_file_id(IsoImage *image, const char *biblio_file_id);
*/ */
const char *iso_image_get_biblio_file_id(const IsoImage *image); const char *iso_image_get_biblio_file_id(const IsoImage *image);
/**
* Get the four timestamps from the Primary Volume Descriptor of the imported
* ISO image. The timestamps are strings which are either empty or consist
* of 17 digits of the form YYYYMMDDhhmmsscc.
* None of the returned string pointers shall be used for altering or freeing
* data. They are just for reading.
*
* @param image
* The image to be inquired.
* @param vol_creation_time
* Returns a pointer to the Volume Creation time:
* When "the information in the volume was created."
* @param vol_modification_time
* Returns a pointer to Volume Modification time:
* When "the information in the volume was last modified."
* @param vol_expiration_time
* Returns a pointer to Volume Expiration time:
* When "the information in the volume may be regarded as obsolete."
* @param vol_effective_time
* Returns a pointer to Volume Expiration time:
* When "the information in the volume may be used."
* @return
* ISO_SUCCESS or error
*
* @since 1.2.8
*/
int iso_image_get_pvd_times(IsoImage *image,
char **creation_time, char **modification_time,
char **expiration_time, char **effective_time);
/** /**
* Create a new set of El-Torito bootable images by adding a boot catalog * Create a new set of El-Torito bootable images by adding a boot catalog
* and the default boot image. * and the default boot image.
@ -7424,11 +7454,14 @@ int iso_image_hfsplus_get_blessed(IsoImage *img, IsoNode ***blessed_nodes,
/** Too many chained symbolic links (FAILURE, HIGH, -395) */ /** Too many chained symbolic links (FAILURE, HIGH, -395) */
#define ISO_DEEP_SYMLINK 0xE830FE75 #define ISO_DEEP_SYMLINK 0xE830FE75
/** Unrecognized file type in ISO image (FAILURE, HIGH, -396) */
#define ISO_BAD_ISO_FILETYPE 0xE830FE74
/* Internal developer note: /* Internal developer note:
Place new error codes directly above this comment. Place new error codes directly above this comment.
Newly introduced errors must get a message entry in Newly introduced errors must get a message entry in
libisofs/message.c, function iso_error_to_msg() libisofs/messages.c, function iso_error_to_msg()
*/ */
/* ! PLACE NEW ERROR CODES ABOVE. NOT AFTER THIS LINE ! */ /* ! PLACE NEW ERROR CODES ABOVE. NOT AFTER THIS LINE ! */

View File

@ -98,6 +98,7 @@ iso_image_get_data_preparer_id;
iso_image_get_mips_boot_files; iso_image_get_mips_boot_files;
iso_image_get_msg_id; iso_image_get_msg_id;
iso_image_get_publisher_id; iso_image_get_publisher_id;
iso_image_get_pvd_times;
iso_image_get_root; iso_image_get_root;
iso_image_get_session_md5; iso_image_get_session_md5;
iso_image_get_system_area; iso_image_get_system_area;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009 Thomas Schmitt * Copyright (c) 2009 - 2013 Thomas Schmitt
* *
* This file is part of the libisofs project; you can redistribute it and/or * This file is part of the libisofs project; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2 * modify it under the terms of the GNU General Public License version 2
@ -527,6 +527,7 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
if (md5_pt == NULL) if (md5_pt == NULL)
return 0; return 0;
if (!target->will_cancel) {
ret = iso_node_lookup_attr(node, "isofs.cx", &value_length, ret = iso_node_lookup_attr(node, "isofs.cx", &value_length,
&value, 0); &value, 0);
if (ret == 1 && value_length == 4) { if (ret == 1 && value_length == 4) {
@ -538,7 +539,13 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
} }
if (value != NULL) if (value != NULL)
free(value); free(value);
/* ts B30114 : It is unclear why these are removed here.
At least with the opts->will_cancel runs,
this is not appropriate.
*/
iso_node_remove_xinfo(node, checksum_md5_xinfo_func); iso_node_remove_xinfo(node, checksum_md5_xinfo_func);
}
iso_node_remove_xinfo(node, checksum_cx_xinfo_func); iso_node_remove_xinfo(node, checksum_cx_xinfo_func);
} }
} else if (node->type == LIBISO_DIR) { } else if (node->type == LIBISO_DIR) {

View File

@ -500,6 +500,8 @@ const char *iso_error_to_msg(int errcode)
return "Symbolic link cannot be resolved"; return "Symbolic link cannot be resolved";
case ISO_DEEP_SYMLINK: case ISO_DEEP_SYMLINK:
return "Too many chained symbolic links"; return "Too many chained symbolic links";
case ISO_BAD_ISO_FILETYPE:
return "Unrecognized file type in ISO image";
default: default:
return "Unknown error"; return "Unknown error";
} }