Support for writting ISO Level 3 images.
This allows files greater than 4GB, that are written using multiple extents.
This commit is contained in:
parent
68bd636bd8
commit
6ff7699c47
@ -1,9 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
* Copyright (c) 2007 Mario Danic
|
* Copyright (c) 2007 Mario Danic
|
||||||
*
|
*
|
||||||
* 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 as
|
* modify it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation. See COPYING file for details.
|
* published by the Free Software Foundation. See COPYING file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -90,10 +90,10 @@ size_t calc_dirent_len(Ecma119Image *t, Ecma119Node *n)
|
|||||||
/**
|
/**
|
||||||
* Computes the total size of all directory entries of a single dir,
|
* Computes the total size of all directory entries of a single dir,
|
||||||
* acording to ECMA-119 6.8.1.1
|
* acording to ECMA-119 6.8.1.1
|
||||||
*
|
*
|
||||||
* This also take into account the size needed for RR entries and
|
* This also take into account the size needed for RR entries and
|
||||||
* SUSP continuation areas (SUSP, 5.1).
|
* SUSP continuation areas (SUSP, 5.1).
|
||||||
*
|
*
|
||||||
* @param ce
|
* @param ce
|
||||||
* Will be filled with the size needed for Continuation Areas
|
* Will be filled with the size needed for Continuation Areas
|
||||||
* @return
|
* @return
|
||||||
@ -131,10 +131,10 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
|
|||||||
len += dirent_len;
|
len += dirent_len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The size of a dir is always a multiple of block size, as we must add
|
* The size of a dir is always a multiple of block size, as we must add
|
||||||
* the size of the unused space after the last directory record
|
* the size of the unused space after the last directory record
|
||||||
* (ECMA-119, 6.8.1.3)
|
* (ECMA-119, 6.8.1.3)
|
||||||
*/
|
*/
|
||||||
len = ROUND_UP(len, BLOCK_SIZE);
|
len = ROUND_UP(len, BLOCK_SIZE);
|
||||||
@ -222,24 +222,26 @@ int ecma119_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a single directory record (ECMA-119, 9.1)
|
* Write a single directory record (ECMA-119, 9.1)
|
||||||
*
|
*
|
||||||
* @param file_id
|
* @param file_id
|
||||||
* if >= 0, we use it instead of the filename (for "." and ".." entries).
|
* if >= 0, we use it instead of the filename (for "." and ".." entries).
|
||||||
* @param len_fi
|
* @param len_fi
|
||||||
* Computed length of the file identifier. Total size of the directory
|
* Computed length of the file identifier. Total size of the directory
|
||||||
* entry will be len + 33 + padding if needed (ECMA-119, 9.1.12)
|
* entry will be len + 33 + padding if needed (ECMA-119, 9.1.12)
|
||||||
* @param info
|
* @param info
|
||||||
* SUSP entries for the given directory record. It will be NULL for the
|
* SUSP entries for the given directory record. It will be NULL for the
|
||||||
* root directory record in the PVD (ECMA-119, 8.4.18) (in order to
|
* root directory record in the PVD (ECMA-119, 8.4.18) (in order to
|
||||||
* distinguish it from the "." entry in the root directory)
|
* distinguish it from the "." entry in the root directory)
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
||||||
uint8_t *buf, size_t len_fi, struct susp_info *info)
|
uint8_t *buf, size_t len_fi, struct susp_info *info,
|
||||||
|
int extent)
|
||||||
{
|
{
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
uint32_t block;
|
uint32_t block;
|
||||||
uint8_t len_dr; /*< size of dir entry without SUSP fields */
|
uint8_t len_dr; /*< size of dir entry without SUSP fields */
|
||||||
|
int multi_extend = 0;
|
||||||
uint8_t *name = (file_id >= 0) ? (uint8_t*)&file_id
|
uint8_t *name = (file_id >= 0) ? (uint8_t*)&file_id
|
||||||
: (uint8_t*)node->iso_name;
|
: (uint8_t*)node->iso_name;
|
||||||
|
|
||||||
@ -260,12 +262,21 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
|||||||
len = node->info.dir->len;
|
len = node->info.dir->len;
|
||||||
block = node->info.dir->block;
|
block = node->info.dir->block;
|
||||||
} else if (node->type == ECMA119_FILE) {
|
} else if (node->type == ECMA119_FILE) {
|
||||||
len = iso_file_src_get_size(node->info.file);
|
off_t size = iso_file_src_get_size(node->info.file)
|
||||||
block = node->info.file->block;
|
- ((off_t)0xFFFFF800) * (off_t)extent; /* bytes in another extent */
|
||||||
|
if (size > (off_t) 0xffffffff) {
|
||||||
|
/* 2097151 is the number of blocks needed to store 4 GB - 2048 */
|
||||||
|
block = node->info.file->block + extent * 2097151;
|
||||||
|
len = 0xFFFFF800;
|
||||||
|
multi_extend = 1;
|
||||||
|
} else {
|
||||||
|
len = (uint32_t) size;
|
||||||
|
block = node->info.file->block;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* for nodes other than files and dirs, we set both
|
* for nodes other than files and dirs, we set both
|
||||||
* len and block to 0
|
* len and block to 0
|
||||||
*/
|
*/
|
||||||
len = 0;
|
len = 0;
|
||||||
block = 0;
|
block = 0;
|
||||||
@ -281,7 +292,7 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
|
|||||||
iso_bb(rec->block, block, 4);
|
iso_bb(rec->block, block, 4);
|
||||||
iso_bb(rec->length, len, 4);
|
iso_bb(rec->length, len, 4);
|
||||||
iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
iso_datetime_7(rec->recording_time, t->now, t->always_gmt);
|
||||||
rec->flags[0] = (node->type == ECMA119_DIR) ? 2 : 0;
|
rec->flags[0] = ((node->type == ECMA119_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
|
||||||
iso_bb(rec->vol_seq_number, 1, 2);
|
iso_bb(rec->vol_seq_number, 1, 2);
|
||||||
rec->len_fi[0] = len_fi;
|
rec->len_fi[0] = len_fi;
|
||||||
|
|
||||||
@ -365,7 +376,7 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
|
|||||||
iso_lsb(vol.l_path_table_pos, t->l_path_table_pos, 4);
|
iso_lsb(vol.l_path_table_pos, t->l_path_table_pos, 4);
|
||||||
iso_msb(vol.m_path_table_pos, t->m_path_table_pos, 4);
|
iso_msb(vol.m_path_table_pos, t->m_path_table_pos, 4);
|
||||||
|
|
||||||
write_one_dir_record(t, t->root, 0, vol.root_dir_record, 1, NULL);
|
write_one_dir_record(t, t->root, 0, vol.root_dir_record, 1, NULL, 0);
|
||||||
|
|
||||||
strncpy_pad((char*)vol.vol_set_id, volset_id, 128);
|
strncpy_pad((char*)vol.vol_set_id, volset_id, 128);
|
||||||
strncpy_pad((char*)vol.publisher_id, pub_id, 128);
|
strncpy_pad((char*)vol.publisher_id, pub_id, 128);
|
||||||
@ -410,14 +421,14 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
|||||||
/* initialize buffer with 0s */
|
/* initialize buffer with 0s */
|
||||||
memset(buffer, 0, BLOCK_SIZE);
|
memset(buffer, 0, BLOCK_SIZE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set susp_info to 0's, this way code for both plain ECMA-119 and
|
* set susp_info to 0's, this way code for both plain ECMA-119 and
|
||||||
* RR is very similar
|
* RR is very similar
|
||||||
*/
|
*/
|
||||||
memset(&info, 0, sizeof(struct susp_info));
|
memset(&info, 0, sizeof(struct susp_info));
|
||||||
if (t->rockridge) {
|
if (t->rockridge) {
|
||||||
/* initialize the ce_block, it might be needed */
|
/* initialize the ce_block, it might be needed */
|
||||||
info.ce_block = dir->info.dir->block + DIV_UP(dir->info.dir->len,
|
info.ce_block = dir->info.dir->block + DIV_UP(dir->info.dir->len,
|
||||||
BLOCK_SIZE);
|
BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -429,7 +440,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
len = 34 + info.suf_len;
|
len = 34 + info.suf_len;
|
||||||
write_one_dir_record(t, dir, 0, buf, 1, &info);
|
write_one_dir_record(t, dir, 0, buf, 1, &info, 0);
|
||||||
buf += len;
|
buf += len;
|
||||||
|
|
||||||
if (t->rockridge) {
|
if (t->rockridge) {
|
||||||
@ -439,40 +450,57 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
len = 34 + info.suf_len;
|
len = 34 + info.suf_len;
|
||||||
write_one_dir_record(t, dir, 1, buf, 1, &info);
|
write_one_dir_record(t, dir, 1, buf, 1, &info, 0);
|
||||||
buf += len;
|
buf += len;
|
||||||
|
|
||||||
for (i = 0; i < dir->info.dir->nchildren; i++) {
|
for (i = 0; i < dir->info.dir->nchildren; i++) {
|
||||||
Ecma119Node *child = dir->info.dir->children[i];
|
Ecma119Node *child = dir->info.dir->children[i];
|
||||||
|
|
||||||
/* compute len of directory entry */
|
int extent = 0;
|
||||||
fi_len = strlen(child->iso_name);
|
do {
|
||||||
len = fi_len + 33 + (fi_len % 2 ? 0 : 1);
|
|
||||||
if (need_version_number(t, child)) {
|
|
||||||
len += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get the SUSP fields if rockridge is enabled */
|
/* compute len of directory entry */
|
||||||
if (t->rockridge) {
|
fi_len = strlen(child->iso_name);
|
||||||
ret = rrip_get_susp_fields(t, child, 0, 255 - len, &info);
|
len = fi_len + 33 + (fi_len % 2 ? 0 : 1);
|
||||||
if (ret < 0) {
|
if (need_version_number(t, child)) {
|
||||||
return ret;
|
len += 2;
|
||||||
}
|
}
|
||||||
len += info.suf_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( (buf + len - buffer) > BLOCK_SIZE) {
|
/* get the SUSP fields if rockridge is enabled */
|
||||||
/* dir doesn't fit in current block */
|
if (t->rockridge) {
|
||||||
ret = iso_write(t, buffer, BLOCK_SIZE);
|
ret = rrip_get_susp_fields(t, child, 0, 255 - len, &info);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
len += info.suf_len;
|
||||||
}
|
}
|
||||||
memset(buffer, 0, BLOCK_SIZE);
|
|
||||||
buf = buffer;
|
if ( (buf + len - buffer) > BLOCK_SIZE) {
|
||||||
}
|
/* dir doesn't fit in current block */
|
||||||
/* write the directory entry in any case */
|
ret = iso_write(t, buffer, BLOCK_SIZE);
|
||||||
write_one_dir_record(t, child, -1, buf, fi_len, &info);
|
if (ret < 0) {
|
||||||
buf += len;
|
return ret;
|
||||||
|
}
|
||||||
|
memset(buffer, 0, BLOCK_SIZE);
|
||||||
|
buf = buffer;
|
||||||
|
}
|
||||||
|
/* write the directory entry in any case */
|
||||||
|
write_one_dir_record(t, child, -1, buf, fi_len, &info, extent);
|
||||||
|
buf += len;
|
||||||
|
|
||||||
|
if (child->type == ECMA119_FILE) {
|
||||||
|
/* check if file is too big and need more extents */
|
||||||
|
off_t size = iso_file_src_get_size(child->info.file)
|
||||||
|
- ((off_t)0xFFFFF800) * (off_t)extent;
|
||||||
|
if (size > (off_t) 0xffffffff) {
|
||||||
|
extent++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break; /* we only have a single extent */
|
||||||
|
}
|
||||||
|
} while(1); /* loop for each extend */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write the last block */
|
/* write the last block */
|
||||||
@ -709,7 +737,7 @@ int pad_writer_write_data(IsoImageWriter *writer)
|
|||||||
return ISO_ASSERT_FAILURE;
|
return ISO_ASSERT_FAILURE;
|
||||||
}
|
}
|
||||||
t = writer->target;
|
t = writer->target;
|
||||||
|
|
||||||
if (t->pad_blocks == 0) {
|
if (t->pad_blocks == 0) {
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -820,7 +848,7 @@ void *write_function(void *arg)
|
|||||||
iso_msg_submit(target->image->id, ISO_IMAGE_WRITE_CANCELED, 0, NULL);
|
iso_msg_submit(target->image->id, ISO_IMAGE_WRITE_CANCELED, 0, NULL);
|
||||||
} else {
|
} else {
|
||||||
/* image write error */
|
/* image write error */
|
||||||
iso_msg_submit(target->image->id, ISO_WRITE_ERROR, res,
|
iso_msg_submit(target->image->id, ISO_WRITE_ERROR, res,
|
||||||
"Image write error");
|
"Image write error");
|
||||||
}
|
}
|
||||||
iso_ring_buffer_writer_close(target->buffer, 1);
|
iso_ring_buffer_writer_close(target->buffer, 1);
|
||||||
@ -855,7 +883,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
target->iso1999 = opts->iso1999;
|
target->iso1999 = opts->iso1999;
|
||||||
target->always_gmt = opts->always_gmt;
|
target->always_gmt = opts->always_gmt;
|
||||||
target->ino = 0;
|
target->ino = 0;
|
||||||
target->omit_version_numbers = opts->omit_version_numbers
|
target->omit_version_numbers = opts->omit_version_numbers
|
||||||
| opts->max_37_char_filenames;
|
| opts->max_37_char_filenames;
|
||||||
target->allow_deep_paths = opts->allow_deep_paths;
|
target->allow_deep_paths = opts->allow_deep_paths;
|
||||||
target->allow_longer_paths = opts->allow_longer_paths;
|
target->allow_longer_paths = opts->allow_longer_paths;
|
||||||
@ -882,7 +910,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
target->appendable = opts->appendable;
|
target->appendable = opts->appendable;
|
||||||
|
|
||||||
target->replace_timestamps = opts->replace_timestamps ? 1 : 0;
|
target->replace_timestamps = opts->replace_timestamps ? 1 : 0;
|
||||||
target->timestamp = opts->replace_timestamps == 2 ?
|
target->timestamp = opts->replace_timestamps == 2 ?
|
||||||
opts->timestamp : target->now;
|
opts->timestamp : target->now;
|
||||||
|
|
||||||
/* el-torito? */
|
/* el-torito? */
|
||||||
@ -909,10 +937,10 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2. Based on those options, create needed writers: iso, joliet...
|
* 2. Based on those options, create needed writers: iso, joliet...
|
||||||
* Each writer inits its structures and stores needed info into
|
* Each writer inits its structures and stores needed info into
|
||||||
* target.
|
* target.
|
||||||
* If the writer needs an volume descriptor, it increments image
|
* If the writer needs an volume descriptor, it increments image
|
||||||
* current block.
|
* current block.
|
||||||
* Finally, create Writer for files.
|
* Finally, create Writer for files.
|
||||||
@ -944,7 +972,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto target_cleanup;
|
goto target_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create writer for El-Torito */
|
/* create writer for El-Torito */
|
||||||
if (target->eltorito) {
|
if (target->eltorito) {
|
||||||
ret = eltorito_writer_create(target);
|
ret = eltorito_writer_create(target);
|
||||||
@ -952,7 +980,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
goto target_cleanup;
|
goto target_cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create writer for Joliet structure */
|
/* create writer for Joliet structure */
|
||||||
if (target->joliet) {
|
if (target->joliet) {
|
||||||
ret = joliet_writer_create(target);
|
ret = joliet_writer_create(target);
|
||||||
@ -960,7 +988,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
goto target_cleanup;
|
goto target_cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create writer for ISO 9660:1999 structure */
|
/* create writer for ISO 9660:1999 structure */
|
||||||
if (target->iso1999) {
|
if (target->iso1999) {
|
||||||
ret = iso1999_writer_create(target);
|
ret = iso1999_writer_create(target);
|
||||||
@ -970,11 +998,11 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
}
|
}
|
||||||
|
|
||||||
voldesc_size = target->curblock - target->ms_block - 16;
|
voldesc_size = target->curblock - target->ms_block - 16;
|
||||||
|
|
||||||
/* Volume Descriptor Set Terminator */
|
/* Volume Descriptor Set Terminator */
|
||||||
target->curblock++;
|
target->curblock++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the writer for possible padding to ensure that in case of image
|
* Create the writer for possible padding to ensure that in case of image
|
||||||
* growing we can safety overwrite the first 64 KiB of image.
|
* growing we can safety overwrite the first 64 KiB of image.
|
||||||
*/
|
*/
|
||||||
@ -990,7 +1018,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 3.
|
* 3.
|
||||||
* Call compute_data_blocks() in each Writer.
|
* Call compute_data_blocks() in each Writer.
|
||||||
* That function computes the size needed by its structures and
|
* That function computes the size needed by its structures and
|
||||||
* increments image current block propertly.
|
* increments image current block propertly.
|
||||||
@ -1130,14 +1158,14 @@ static void bs_free_data(struct burn_source *bs)
|
|||||||
if (st < 4) {
|
if (st < 4) {
|
||||||
/* forces writer to stop if it is still running */
|
/* forces writer to stop if it is still running */
|
||||||
iso_ring_buffer_reader_close(target->buffer, 0);
|
iso_ring_buffer_reader_close(target->buffer, 0);
|
||||||
|
|
||||||
/* wait until writer thread finishes */
|
/* wait until writer thread finishes */
|
||||||
pthread_join(target->wthread, NULL);
|
pthread_join(target->wthread, NULL);
|
||||||
iso_msg_debug(target->image->id, "Writer thread joined");
|
iso_msg_debug(target->image->id, "Writer thread joined");
|
||||||
}
|
}
|
||||||
|
|
||||||
iso_msg_debug(target->image->id,
|
iso_msg_debug(target->image->id,
|
||||||
"Ring buffer was %d times full and %d times empty",
|
"Ring buffer was %d times full and %d times empty",
|
||||||
iso_ring_buffer_get_times_full(target->buffer),
|
iso_ring_buffer_get_times_full(target->buffer),
|
||||||
iso_ring_buffer_get_times_empty(target->buffer));
|
iso_ring_buffer_get_times_empty(target->buffer));
|
||||||
|
|
||||||
@ -1153,9 +1181,9 @@ int bs_cancel(struct burn_source *bs)
|
|||||||
Ecma119Image *target = (Ecma119Image*)bs->data;
|
Ecma119Image *target = (Ecma119Image*)bs->data;
|
||||||
|
|
||||||
st = iso_ring_buffer_get_status(bs, &cap, &free);
|
st = iso_ring_buffer_get_status(bs, &cap, &free);
|
||||||
|
|
||||||
if (free == cap && (st == 2 || st == 3)) {
|
if (free == cap && (st == 2 || st == 3)) {
|
||||||
/* image was already consumed */
|
/* image was already consumed */
|
||||||
iso_ring_buffer_reader_close(target->buffer, 0);
|
iso_ring_buffer_reader_close(target->buffer, 0);
|
||||||
} else {
|
} else {
|
||||||
iso_msg_debug(target->image->id, "Reader thread being cancelled");
|
iso_msg_debug(target->image->id, "Reader thread being cancelled");
|
||||||
@ -1176,7 +1204,7 @@ int bs_set_size(struct burn_source *bs, off_t size)
|
|||||||
{
|
{
|
||||||
Ecma119Image *target = (Ecma119Image*)bs->data;
|
Ecma119Image *target = (Ecma119Image*)bs->data;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* just set the value to be returned by get_size. This is not used at
|
* just set the value to be returned by get_size. This is not used at
|
||||||
* all by libisofs, it is here just for helping libburn to correctly pad
|
* all by libisofs, it is here just for helping libburn to correctly pad
|
||||||
* the image if needed.
|
* the image if needed.
|
||||||
@ -1235,12 +1263,12 @@ int iso_write(Ecma119Image *target, void *buf, size_t count)
|
|||||||
if (ret > 0 && (target->total_size != (off_t) 0)){
|
if (ret > 0 && (target->total_size != (off_t) 0)){
|
||||||
unsigned int kbw, kbt;
|
unsigned int kbw, kbt;
|
||||||
int percent;
|
int percent;
|
||||||
|
|
||||||
target->bytes_written += (off_t) count;
|
target->bytes_written += (off_t) count;
|
||||||
kbw = (unsigned int) (target->bytes_written >> 10);
|
kbw = (unsigned int) (target->bytes_written >> 10);
|
||||||
kbt = (unsigned int) (target->total_size >> 10);
|
kbt = (unsigned int) (target->total_size >> 10);
|
||||||
percent = (kbw * 100) / kbt;
|
percent = (kbw * 100) / kbt;
|
||||||
|
|
||||||
/* only report in 5% chunks */
|
/* only report in 5% chunks */
|
||||||
if (percent >= target->percent_written + 5) {
|
if (percent >= target->percent_written + 5) {
|
||||||
iso_msg_debug(target->image->id, "Processed %u of %u KB (%d %%)",
|
iso_msg_debug(target->image->id, "Processed %u of %u KB (%d %%)",
|
||||||
@ -1248,26 +1276,26 @@ int iso_write(Ecma119Image *target, void *buf, size_t count)
|
|||||||
target->percent_written = percent;
|
target->percent_written = percent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iso_write_opts_new(IsoWriteOpts **opts, int profile)
|
int iso_write_opts_new(IsoWriteOpts **opts, int profile)
|
||||||
{
|
{
|
||||||
IsoWriteOpts *wopts;
|
IsoWriteOpts *wopts;
|
||||||
|
|
||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
if (profile < 0 || profile > 2) {
|
if (profile < 0 || profile > 2) {
|
||||||
return ISO_WRONG_ARG_VALUE;
|
return ISO_WRONG_ARG_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
wopts = calloc(1, sizeof(IsoWriteOpts));
|
wopts = calloc(1, sizeof(IsoWriteOpts));
|
||||||
if (wopts == NULL) {
|
if (wopts == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (profile) {
|
switch (profile) {
|
||||||
case 0:
|
case 0:
|
||||||
wopts->level = 1;
|
wopts->level = 1;
|
||||||
@ -1305,7 +1333,7 @@ void iso_write_opts_free(IsoWriteOpts *opts)
|
|||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(opts->output_charset);
|
free(opts->output_charset);
|
||||||
free(opts);
|
free(opts);
|
||||||
}
|
}
|
||||||
@ -1315,7 +1343,7 @@ int iso_write_opts_set_iso_level(IsoWriteOpts *opts, int level)
|
|||||||
if (opts == NULL) {
|
if (opts == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
if (level != 1 && level != 2) {
|
if (level != 1 && level != 2 && level != 3) {
|
||||||
return ISO_WRONG_ARG_VALUE;
|
return ISO_WRONG_ARG_VALUE;
|
||||||
}
|
}
|
||||||
opts->level = level;
|
opts->level = level;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
*
|
*
|
||||||
* 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 as
|
* modify it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation. See COPYING file for details.
|
* published by the Free Software Foundation. See COPYING file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -61,18 +61,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 ? 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 ? 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 ? 0 : 1);
|
||||||
} else {
|
} else {
|
||||||
isoname = iso_2_fileid(ascii_name);
|
isoname = iso_2_fileid(ascii_name);
|
||||||
@ -84,7 +84,7 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
|
|||||||
*name = isoname;
|
*name = isoname;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* only possible if mem error, as check for empty names is done
|
* only possible if mem error, as check for empty names is done
|
||||||
* in public tree
|
* in public tree
|
||||||
*/
|
*/
|
||||||
@ -129,7 +129,7 @@ int create_dir(Ecma119Image *img, IsoDir *iso, Ecma119Node **node)
|
|||||||
if (children == NULL) {
|
if (children == NULL) {
|
||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_info = calloc(1, sizeof(struct ecma119_dir_info));
|
dir_info = calloc(1, sizeof(struct ecma119_dir_info));
|
||||||
if (dir_info == NULL) {
|
if (dir_info == NULL) {
|
||||||
free(children);
|
free(children);
|
||||||
@ -161,7 +161,7 @@ int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node)
|
|||||||
off_t size;
|
off_t size;
|
||||||
|
|
||||||
size = iso_stream_get_size(iso->stream);
|
size = iso_stream_get_size(iso->stream);
|
||||||
if (size > (off_t)0xffffffff) {
|
if (size > (off_t)0xffffffff && img->iso_level != 3) {
|
||||||
return iso_msg_submit(img->image->id, ISO_FILE_TOO_BIG, 0,
|
return iso_msg_submit(img->image->id, ISO_FILE_TOO_BIG, 0,
|
||||||
"File \"%s\" can't be added to image because "
|
"File \"%s\" can't be added to image because "
|
||||||
"is greater than 4GB", iso->node.name);
|
"is greater than 4GB", iso->node.name);
|
||||||
@ -174,9 +174,9 @@ int create_file(Ecma119Image *img, IsoFile *iso, Ecma119Node **node)
|
|||||||
|
|
||||||
ret = create_ecma119_node(img, (IsoNode*)iso, node);
|
ret = create_ecma119_node(img, (IsoNode*)iso, node);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/*
|
/*
|
||||||
* the src doesn't need to be freed, it is free together with
|
* the src doesn't need to be freed, it is free together with
|
||||||
* the Ecma119Image
|
* the Ecma119Image
|
||||||
*/
|
*/
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -203,9 +203,9 @@ int create_boot_cat(Ecma119Image *img, IsoBoot *iso, Ecma119Node **node)
|
|||||||
|
|
||||||
ret = create_ecma119_node(img, (IsoNode*)iso, node);
|
ret = create_ecma119_node(img, (IsoNode*)iso, node);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
/*
|
/*
|
||||||
* the src doesn't need to be freed, it is free together with
|
* the src doesn't need to be freed, it is free together with
|
||||||
* the Ecma119Image
|
* the Ecma119Image
|
||||||
*/
|
*/
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -267,10 +267,10 @@ void ecma119_node_free(Ecma119Node *node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* 1 success, 0 node ignored, < 0 error
|
* 1 success, 0 node ignored, < 0 error
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
||||||
@ -318,7 +318,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
} else {
|
} else {
|
||||||
/* symlinks are only supported when RR is enabled */
|
/* symlinks are only supported when RR is enabled */
|
||||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
||||||
"File \"%s\" ignored. Symlinks need RockRidge extensions.",
|
"File \"%s\" ignored. Symlinks need RockRidge extensions.",
|
||||||
iso->name);
|
iso->name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -328,7 +328,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
} else {
|
} else {
|
||||||
/* symlinks are only supported when RR is enabled */
|
/* symlinks are only supported when RR is enabled */
|
||||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
||||||
"File \"%s\" ignored. Special files need RockRidge extensions.",
|
"File \"%s\" ignored. Special files need RockRidge extensions.",
|
||||||
iso->name);
|
iso->name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -338,7 +338,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
|
|||||||
} else {
|
} else {
|
||||||
/* log and ignore */
|
/* log and ignore */
|
||||||
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
ret = iso_msg_submit(image->image->id, ISO_FILE_IGNORED, 0,
|
||||||
"El-Torito catalog found on a image without El-Torito.",
|
"El-Torito catalog found on a image without El-Torito.",
|
||||||
iso->name);
|
iso->name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -430,9 +430,9 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
|
|
||||||
nchildren = dir->info.dir->nchildren;
|
nchildren = dir->info.dir->nchildren;
|
||||||
children = dir->info.dir->children;
|
children = dir->info.dir->children;
|
||||||
|
|
||||||
/* a hash table will temporary hold the names, for fast searching */
|
/* a hash table will temporary hold the names, for fast searching */
|
||||||
ret = iso_htable_create((nchildren * 100) / 80, iso_str_hash,
|
ret = iso_htable_create((nchildren * 100) / 80, iso_str_hash,
|
||||||
(compare_function_t)strcmp, &table);
|
(compare_function_t)strcmp, &table);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
@ -463,7 +463,7 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A max of 7 characters is good enought, it allows handling up to
|
* 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
|
* 9,999,999 files with same name. We can increment this to
|
||||||
* max_name_len, but the int_pow() function must then be modified
|
* max_name_len, but the int_pow() function must then be modified
|
||||||
* to return a bigger integer.
|
* to return a bigger integer.
|
||||||
@ -480,8 +480,8 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
dot = strrchr(full_name, '.');
|
dot = strrchr(full_name, '.');
|
||||||
if (dot != NULL && children[i]->type != ECMA119_DIR) {
|
if (dot != NULL && children[i]->type != ECMA119_DIR) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* File (not dir) with extension
|
* File (not dir) with extension
|
||||||
* Note that we don't need to check for placeholders, as
|
* Note that we don't need to check for placeholders, as
|
||||||
* tree reparent happens later, so no placeholders can be
|
* tree reparent happens later, so no placeholders can be
|
||||||
* here at this time.
|
* here at this time.
|
||||||
@ -491,26 +491,26 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
name = full_name;
|
name = full_name;
|
||||||
ext = dot + 1;
|
ext = dot + 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For iso level 1 we force ext len to be 3, as name
|
* For iso level 1 we force ext len to be 3, as name
|
||||||
* can't grow on the extension space
|
* can't grow on the extension space
|
||||||
*/
|
*/
|
||||||
extlen = (max_file_len == 12) ? 3 : strlen(ext);
|
extlen = (max_file_len == 12) ? 3 : strlen(ext);
|
||||||
max = max_file_len - extlen - 1 - digits;
|
max = max_file_len - extlen - 1 - digits;
|
||||||
if (max <= 0) {
|
if (max <= 0) {
|
||||||
/* this can happen if extension is too long */
|
/* this can happen if extension is too long */
|
||||||
if (extlen + max > 3) {
|
if (extlen + max > 3) {
|
||||||
/*
|
/*
|
||||||
* reduce extension len, to give name an extra char
|
* reduce extension len, to give name an extra char
|
||||||
* note that max is negative or 0
|
* note that max is negative or 0
|
||||||
*/
|
*/
|
||||||
extlen = extlen + max - 1;
|
extlen = extlen + max - 1;
|
||||||
ext[extlen] = '\0';
|
ext[extlen] = '\0';
|
||||||
max = max_file_len - extlen - 1 - digits;
|
max = max_file_len - extlen - 1 - digits;
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* error, we don't support extensions < 3
|
* error, we don't support extensions < 3
|
||||||
* This can't happen with current limit of digits.
|
* This can't happen with current limit of digits.
|
||||||
*/
|
*/
|
||||||
ret = ISO_ERROR;
|
ret = ISO_ERROR;
|
||||||
goto mangle_cleanup;
|
goto mangle_cleanup;
|
||||||
@ -572,7 +572,7 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
children[k]->iso_name = new;
|
children[k]->iso_name = new;
|
||||||
iso_htable_add(table, new, new);
|
iso_htable_add(table, new, new);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if we change a name we need to sort again children
|
* if we change a name we need to sort again children
|
||||||
* at the end
|
* at the end
|
||||||
*/
|
*/
|
||||||
@ -603,7 +603,7 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = ISO_SUCCESS;
|
ret = ISO_SUCCESS;
|
||||||
|
|
||||||
mangle_cleanup : ;
|
mangle_cleanup : ;
|
||||||
iso_htable_destroy(table, NULL);
|
iso_htable_destroy(table, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
@ -658,7 +658,7 @@ int mangle_tree(Ecma119Image *img, int recurse)
|
|||||||
/**
|
/**
|
||||||
* Create a new ECMA-119 node representing a placeholder for a relocated
|
* Create a new ECMA-119 node representing a placeholder for a relocated
|
||||||
* dir.
|
* dir.
|
||||||
*
|
*
|
||||||
* See IEEE P1282, section 4.1.5 for details
|
* See IEEE P1282, section 4.1.5 for details
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
@ -672,10 +672,10 @@ int create_placeholder(Ecma119Node *parent, Ecma119Node *real,
|
|||||||
return ISO_OUT_OF_MEM;
|
return ISO_OUT_OF_MEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO
|
* TODO
|
||||||
* If real is a dir, while placeholder is a file, ISO name restricctions
|
* If real is a dir, while placeholder is a file, ISO name restricctions
|
||||||
* are different, what to do?
|
* are different, what to do?
|
||||||
*/
|
*/
|
||||||
ret->iso_name = strdup(real->iso_name);
|
ret->iso_name = strdup(real->iso_name);
|
||||||
if (ret->iso_name == NULL) {
|
if (ret->iso_name == NULL) {
|
||||||
@ -708,10 +708,10 @@ size_t max_child_name_len(Ecma119Node *dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Relocates a directory, as specified in Rock Ridge Specification
|
* Relocates a directory, as specified in Rock Ridge Specification
|
||||||
* (see IEEE P1282, section 4.1.5). This is needed when the number of levels
|
* (see IEEE P1282, section 4.1.5). This is needed when the number of levels
|
||||||
* on a directory hierarchy exceeds 8, or the length of a path is higher
|
* on a directory hierarchy exceeds 8, or the length of a path is higher
|
||||||
* than 255 characters, as specified in ECMA-119, section 6.8.2.1
|
* than 255 characters, as specified in ECMA-119, section 6.8.2.1
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
int reparent(Ecma119Node *child, Ecma119Node *parent)
|
int reparent(Ecma119Node *child, Ecma119Node *parent)
|
||||||
@ -743,7 +743,7 @@ int reparent(Ecma119Node *child, Ecma119Node *parent)
|
|||||||
/* add the child to its new parent */
|
/* add the child to its new parent */
|
||||||
child->parent = parent;
|
child->parent = parent;
|
||||||
parent->info.dir->nchildren++;
|
parent->info.dir->nchildren++;
|
||||||
parent->info.dir->children = realloc(parent->info.dir->children,
|
parent->info.dir->children = realloc(parent->info.dir->children,
|
||||||
sizeof(void*) * parent->info.dir->nchildren);
|
sizeof(void*) * parent->info.dir->nchildren);
|
||||||
parent->info.dir->children[parent->info.dir->nchildren - 1] = child;
|
parent->info.dir->children[parent->info.dir->nchildren - 1] = child;
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
@ -754,7 +754,7 @@ int reparent(Ecma119Node *child, Ecma119Node *parent)
|
|||||||
* - the depth is at most 8
|
* - the depth is at most 8
|
||||||
* - each path length is at most 255 characters
|
* - each path length is at most 255 characters
|
||||||
* This restriction is imposed by ECMA-119 specification (ECMA-119, 6.8.2.1).
|
* This restriction is imposed by ECMA-119 specification (ECMA-119, 6.8.2.1).
|
||||||
*
|
*
|
||||||
* @param dir
|
* @param dir
|
||||||
* Dir we are currently processing
|
* Dir we are currently processing
|
||||||
* @param level
|
* @param level
|
||||||
@ -778,9 +778,9 @@ int reorder_tree(Ecma119Image *img, Ecma119Node *dir, int level, int pathlen)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we are appended to the root's children now, so there is no
|
* we are appended to the root's children now, so there is no
|
||||||
* need to recurse (the root will hit us again)
|
* need to recurse (the root will hit us again)
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -831,7 +831,7 @@ int ecma119_tree_create(Ecma119Image *img)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* and we need to remangle the root directory, as the function
|
* and we need to remangle the root directory, as the function
|
||||||
* above could insert new directories into the root.
|
* above could insert new directories into the root.
|
||||||
* Note that recurse = 0, as we don't need to recurse.
|
* Note that recurse = 0, as we don't need to recurse.
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Vreixo Formoso
|
* Copyright (c) 2007 Vreixo Formoso
|
||||||
*
|
*
|
||||||
* 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 as
|
* modify it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation. See COPYING file for details.
|
* published by the Free Software Foundation. See COPYING file for details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -84,12 +84,12 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a given IsoFileSrc to the given image target.
|
* Add a given IsoFileSrc to the given image target.
|
||||||
*
|
*
|
||||||
* The IsoFileSrc will be cached in a tree to prevent the same file for
|
* The IsoFileSrc will be cached in a tree to prevent the same file for
|
||||||
* being written several times to image. If you call again this function
|
* being written several times to image. If you call again this function
|
||||||
* with a node that refers to the same source file, the previously
|
* with a node that refers to the same source file, the previously
|
||||||
* created one will be returned.
|
* created one will be returned.
|
||||||
*
|
*
|
||||||
* @param img
|
* @param img
|
||||||
* The image where this file is to be written
|
* The image where this file is to be written
|
||||||
* @param new
|
* @param new
|
||||||
@ -97,7 +97,7 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
|
|||||||
* @param src
|
* @param src
|
||||||
* Will be filled with a pointer to the IsoFileSrc really present in
|
* Will be filled with a pointer to the IsoFileSrc really present in
|
||||||
* the tree. It could be different than new if the same file already
|
* the tree. It could be different than new if the same file already
|
||||||
* exists in the tree.
|
* exists in the tree.
|
||||||
* @return
|
* @return
|
||||||
* 1 on success, 0 if file already exists on tree, < 0 error
|
* 1 on success, 0 if file already exists on tree, < 0 error
|
||||||
*/
|
*/
|
||||||
@ -108,7 +108,7 @@ int iso_file_src_add(Ecma119Image *img, IsoFileSrc *new, IsoFileSrc **src)
|
|||||||
if (img == NULL || new == NULL || src == NULL) {
|
if (img == NULL || new == NULL || src == NULL) {
|
||||||
return ISO_NULL_POINTER;
|
return ISO_NULL_POINTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* insert the filesrc in the tree */
|
/* insert the filesrc in the tree */
|
||||||
ret = iso_rbtree_insert(img->files, new, (void**)src);
|
ret = iso_rbtree_insert(img->files, new, (void**)src);
|
||||||
return ret;
|
return ret;
|
||||||
@ -160,7 +160,7 @@ int filesrc_writer_compute_data_blocks(IsoImageWriter *writer)
|
|||||||
} else {
|
} else {
|
||||||
inc_item = NULL;
|
inc_item = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store the filesrcs in a array */
|
/* store the filesrcs in a array */
|
||||||
filelist = (IsoFileSrc**)iso_rbtree_to_array(t->files, inc_item, &size);
|
filelist = (IsoFileSrc**)iso_rbtree_to_array(t->files, inc_item, &size);
|
||||||
if (filelist == NULL) {
|
if (filelist == NULL) {
|
||||||
@ -259,22 +259,17 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
|||||||
i = 0;
|
i = 0;
|
||||||
while ((file = filelist[i++]) != NULL) {
|
while ((file = filelist[i++]) != NULL) {
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO WARNING
|
|
||||||
* when we allow files greater than 4GB, current DIV_UP implementation
|
|
||||||
* can overflow!!
|
|
||||||
*/
|
|
||||||
uint32_t nblocks = DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE);
|
uint32_t nblocks = DIV_UP(iso_file_src_get_size(file), BLOCK_SIZE);
|
||||||
|
|
||||||
res = filesrc_open(file);
|
res = filesrc_open(file);
|
||||||
iso_stream_get_file_name(file->stream, name);
|
iso_stream_get_file_name(file->stream, name);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
/*
|
/*
|
||||||
* UPS, very ugly error, the best we can do is just to write
|
* UPS, very ugly error, the best we can do is just to write
|
||||||
* 0's to image
|
* 0's to image
|
||||||
*/
|
*/
|
||||||
iso_report_errfile(name, ISO_FILE_CANT_WRITE, 0, 0);
|
iso_report_errfile(name, ISO_FILE_CANT_WRITE, 0, 0);
|
||||||
res = iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, res,
|
res = iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, res,
|
||||||
"File \"%s\" can't be opened. Filling with 0s.", name);
|
"File \"%s\" can't be opened. Filling with 0s.", name);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return res; /* aborted due to error severity */
|
return res; /* aborted due to error severity */
|
||||||
@ -290,7 +285,7 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
|||||||
continue;
|
continue;
|
||||||
} else if (res > 1) {
|
} else if (res > 1) {
|
||||||
iso_report_errfile(name, ISO_FILE_CANT_WRITE, 0, 0);
|
iso_report_errfile(name, ISO_FILE_CANT_WRITE, 0, 0);
|
||||||
res = iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, 0,
|
res = iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, 0,
|
||||||
"Size of file \"%s\" has changed. It will be %s", name,
|
"Size of file \"%s\" has changed. It will be %s", name,
|
||||||
(res == 2 ? "truncated" : "padded with 0's"));
|
(res == 2 ? "truncated" : "padded with 0's"));
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
@ -338,7 +333,7 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
|
|||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return res; /* aborted due error severity */
|
return res; /* aborted due error severity */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fill with 0s */
|
/* fill with 0s */
|
||||||
iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, 0,
|
iso_msg_submit(t->image->id, ISO_FILE_CANT_WRITE, 0,
|
||||||
"Filling with 0");
|
"Filling with 0");
|
||||||
|
1223
libisofs/libisofs.h
1223
libisofs/libisofs.h
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user