Consolidated the single copies of IsoWriteOpts members in Ecma119Image

by having a copy of the whole IsoWriteOpts in Ecma119Image
This commit is contained in:
Thomas Schmitt 2013-12-22 19:02:44 +01:00
parent 3e3c15812b
commit fa61b94ac8
14 changed files with 400 additions and 483 deletions

View File

@ -56,6 +56,10 @@
#endif /* ! Xorriso_standalonE */ #endif /* ! Xorriso_standalonE */
int iso_write_opts_clone(IsoWriteOpts *in, IsoWriteOpts **out, int flag);
/* /*
* TODO #00011 : guard against bad path table usage with more than 65535 dirs * TODO #00011 : guard against bad path table usage with more than 65535 dirs
* image with more than 65535 directories have path_table related problems * image with more than 65535 directories have path_table related problems
@ -78,6 +82,8 @@ void ecma119_image_free(Ecma119Image *t)
if (t->root != NULL) if (t->root != NULL)
ecma119_node_free(t->root); ecma119_node_free(t->root);
if (t->opts != NULL)
iso_write_opts_free(t->opts);
if (t->image != NULL) if (t->image != NULL)
iso_image_unref(t->image); iso_image_unref(t->image);
if (t->files != NULL) if (t->files != NULL)
@ -90,8 +96,6 @@ void ecma119_image_free(Ecma119Image *t)
writer->free_data(writer); writer->free_data(writer);
free(writer); free(writer);
} }
if (t->rr_reloc_dir != NULL)
free(t->rr_reloc_dir);
if (t->input_charset != NULL) if (t->input_charset != NULL)
free(t->input_charset); free(t->input_charset);
if (t->output_charset != NULL) if (t->output_charset != NULL)
@ -110,13 +114,6 @@ void ecma119_image_free(Ecma119Image *t)
free(t->writers); free(t->writers);
if (t->partition_root != NULL) if (t->partition_root != NULL)
ecma119_node_free(t->partition_root); ecma119_node_free(t->partition_root);
if (t->prep_partition != NULL)
free(t->prep_partition);
if (t->efi_boot_partition != NULL)
free(t->efi_boot_partition);
for (i = 0; i < ISO_MAX_PARTITIONS; i++)
if (t->appended_partitions[i] != NULL)
free(t->appended_partitions[i]);
for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++)
if (t->hfsplus_blessed[i] != NULL) if (t->hfsplus_blessed[i] != NULL)
iso_node_unref(t->hfsplus_blessed[i]); iso_node_unref(t->hfsplus_blessed[i]);
@ -140,11 +137,11 @@ static int show_chunk_to_jte(Ecma119Image *target, char *buf, int count)
int ret; int ret;
if (target->libjte_handle == NULL) if (target->opts->libjte_handle == NULL)
return ISO_SUCCESS; return ISO_SUCCESS;
ret = libjte_show_data_chunk(target->libjte_handle, buf, count, 1); ret = libjte_show_data_chunk(target->opts->libjte_handle, buf, count, 1);
if (ret <= 0) { if (ret <= 0) {
iso_libjte_forward_msgs(target->libjte_handle, iso_libjte_forward_msgs(target->opts->libjte_handle,
target->image->id, ISO_LIBJTE_FILE_FAILED, 0); target->image->id, ISO_LIBJTE_FILE_FAILED, 0);
return ISO_LIBJTE_FILE_FAILED; return ISO_LIBJTE_FILE_FAILED;
} }
@ -160,7 +157,8 @@ static int show_chunk_to_jte(Ecma119Image *target, char *buf, int count)
static static
int need_version_number(Ecma119Image *t, Ecma119Node *n) int need_version_number(Ecma119Image *t, Ecma119Node *n)
{ {
if ((t->omit_version_numbers & 1) || t->untranslated_name_len > 0) { if ((t->opts->omit_version_numbers & 1) ||
t->opts->max_37_char_filenames || t->opts->untranslated_name_len > 0) {
return 0; return 0;
} }
if (n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER) { if (n->type == ECMA119_DIR || n->type == ECMA119_PLACEHOLDER) {
@ -206,7 +204,7 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
/* size of "." and ".." entries */ /* size of "." and ".." entries */
len = 34 + 34; len = 34 + 34;
if (t->rockridge) { if (t->opts->rockridge) {
len += rrip_calc_len(t, dir, 1, 34, &ce_len); len += rrip_calc_len(t, dir, 1, 34, &ce_len);
*ce += ce_len; *ce += ce_len;
len += rrip_calc_len(t, dir, 2, 34, &ce_len); len += rrip_calc_len(t, dir, 2, 34, &ce_len);
@ -221,7 +219,7 @@ size_t calc_dir_size(Ecma119Image *t, Ecma119Node *dir, size_t *ce)
nsections = (child->type == ECMA119_FILE) ? child->info.file->nsections : 1; nsections = (child->type == ECMA119_FILE) ? child->info.file->nsections : 1;
for (section = 0; section < nsections; ++section) { for (section = 0; section < nsections; ++section) {
size_t dirent_len = calc_dirent_len(t, child); size_t dirent_len = calc_dirent_len(t, child);
if (t->rockridge) { if (t->opts->rockridge) {
dirent_len += rrip_calc_len(t, child, 0, dirent_len, &ce_len); dirent_len += rrip_calc_len(t, child, 0, dirent_len, &ce_len);
*ce += ce_len; *ce += ce_len;
} }
@ -257,7 +255,7 @@ void calc_dir_pos(Ecma119Image *t, Ecma119Node *dir)
dir->info.dir->block = t->curblock; dir->info.dir->block = t->curblock;
len = calc_dir_size(t, dir, &ce_len); len = calc_dir_size(t, dir, &ce_len);
t->curblock += DIV_UP(len, BLOCK_SIZE); t->curblock += DIV_UP(len, BLOCK_SIZE);
if (t->rockridge) { if (t->opts->rockridge) {
t->curblock += DIV_UP(ce_len, BLOCK_SIZE); t->curblock += DIV_UP(ce_len, BLOCK_SIZE);
} }
for (i = 0; i < dir->info.dir->nchildren; i++) { for (i = 0; i < dir->info.dir->nchildren; i++) {
@ -321,13 +319,13 @@ int ecma119_writer_compute_data_blocks(IsoImageWriter *writer)
target->curblock += DIV_UP(path_table_size, BLOCK_SIZE); target->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
target->path_table_size = path_table_size; target->path_table_size = path_table_size;
if (target->md5_session_checksum) { if (target->opts->md5_session_checksum) {
/* Account for first tree checksum tag */ /* Account for first tree checksum tag */
target->checksum_tree_tag_pos = target->curblock; target->checksum_tree_tag_pos = target->curblock;
target->curblock++; target->curblock++;
} }
if (target->partition_offset > 0) { if (target->opts->partition_offset > 0) {
/* Take into respect the second directory tree */ /* Take into respect the second directory tree */
ndirs = target->ndirs; ndirs = target->ndirs;
target->ndirs = 0; target->ndirs = 0;
@ -406,7 +404,7 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
* the content block address to a dummy value. * the content block address to a dummy value.
*/ */
len = 0; len = 0;
if (! t->old_empty) if (! t->opts->old_empty)
block = t->empty_file_block; block = t->empty_file_block;
else else
block = 0; block = 0;
@ -421,13 +419,13 @@ void write_one_dir_record(Ecma119Image *t, Ecma119Node *node, int file_id,
rec->len_dr[0] = len_dr + (info != NULL ? info->suf_len : 0); rec->len_dr[0] = len_dr + (info != NULL ? info->suf_len : 0);
iso_bb(rec->block, block - t->eff_partition_offset, 4); iso_bb(rec->block, block - t->eff_partition_offset, 4);
iso_bb(rec->length, len, 4); iso_bb(rec->length, len, 4);
if (t->dir_rec_mtime & 1) { if (t->opts->dir_rec_mtime & 1) {
iso= node->node; iso= node->node;
iso_datetime_7(rec->recording_time, iso_datetime_7(rec->recording_time,
t->replace_timestamps ? t->timestamp : iso->mtime, t->replace_timestamps ? t->timestamp : iso->mtime,
t->always_gmt); t->opts->always_gmt);
} else { } else {
iso_datetime_7(rec->recording_time, t->now, t->always_gmt); iso_datetime_7(rec->recording_time, t->now, t->opts->always_gmt);
} }
rec->flags[0] = ((node->type == ECMA119_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0); rec->flags[0] = ((node->type == ECMA119_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2); iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
@ -469,50 +467,52 @@ void ecma119_set_voldescr_times(IsoImageWriter *writer,
struct ecma119_pri_vol_desc *vol) struct ecma119_pri_vol_desc *vol)
{ {
Ecma119Image *t = writer->target; Ecma119Image *t = writer->target;
IsoWriteOpts *o;
int i; int i;
if (t->vol_uuid[0]) { o = t->opts;
if (o->vol_uuid[0]) {
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
if(t->vol_uuid[i] < '0' || t->vol_uuid[i] > '9') if(o->vol_uuid[i] < '0' || o->vol_uuid[i] > '9')
break; break;
else else
vol->vol_creation_time[i] = t->vol_uuid[i]; vol->vol_creation_time[i] = o->vol_uuid[i];
for(; i < 16; i++) for(; i < 16; i++)
vol->vol_creation_time[i] = '1'; vol->vol_creation_time[i] = '1';
vol->vol_creation_time[16] = 0; vol->vol_creation_time[16] = 0;
} else if (t->vol_creation_time > 0) } else if (o->vol_creation_time > 0)
iso_datetime_17(vol->vol_creation_time, t->vol_creation_time, iso_datetime_17(vol->vol_creation_time, o->vol_creation_time,
t->always_gmt); o->always_gmt);
else else
iso_datetime_17(vol->vol_creation_time, t->now, t->always_gmt); iso_datetime_17(vol->vol_creation_time, t->now, o->always_gmt);
if (t->vol_uuid[0]) { if (o->vol_uuid[0]) {
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
if(t->vol_uuid[i] < '0' || t->vol_uuid[i] > '9') if(o->vol_uuid[i] < '0' || o->vol_uuid[i] > '9')
break; break;
else else
vol->vol_modification_time[i] = t->vol_uuid[i]; vol->vol_modification_time[i] = o->vol_uuid[i];
for(; i < 16; i++) for(; i < 16; i++)
vol->vol_modification_time[i] = '1'; vol->vol_modification_time[i] = '1';
vol->vol_modification_time[16] = 0; vol->vol_modification_time[16] = 0;
} else if (t->vol_modification_time > 0) } else if (o->vol_modification_time > 0)
iso_datetime_17(vol->vol_modification_time, t->vol_modification_time, iso_datetime_17(vol->vol_modification_time, o->vol_modification_time,
t->always_gmt); o->always_gmt);
else else
iso_datetime_17(vol->vol_modification_time, t->now, t->always_gmt); iso_datetime_17(vol->vol_modification_time, t->now, o->always_gmt);
if (t->vol_expiration_time > 0) { if (o->vol_expiration_time > 0) {
iso_datetime_17(vol->vol_expiration_time, t->vol_expiration_time, iso_datetime_17(vol->vol_expiration_time, o->vol_expiration_time,
t->always_gmt); o->always_gmt);
} else { } else {
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
vol->vol_expiration_time[i] = '0'; vol->vol_expiration_time[i] = '0';
vol->vol_expiration_time[16] = 0; vol->vol_expiration_time[16] = 0;
} }
if (t->vol_effective_time > 0) { if (o->vol_effective_time > 0) {
iso_datetime_17(vol->vol_effective_time, t->vol_effective_time, iso_datetime_17(vol->vol_effective_time, o->vol_effective_time,
t->always_gmt); o->always_gmt);
} else { } else {
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
vol->vol_effective_time[i] = '0'; vol->vol_effective_time[i] = '0';
@ -544,7 +544,7 @@ int ecma119_writer_write_vol_desc(IsoImageWriter *writer)
memset(&vol, 0, sizeof(struct ecma119_pri_vol_desc)); memset(&vol, 0, sizeof(struct ecma119_pri_vol_desc));
if (t->relaxed_vol_atts) { if (t->opts->relaxed_vol_atts) {
vol_id = get_relaxed_vol_id(t, image->volume_id); vol_id = get_relaxed_vol_id(t, image->volume_id);
volset_id = get_relaxed_vol_id(t, image->volset_id); volset_id = get_relaxed_vol_id(t, image->volset_id);
} else { } else {
@ -633,14 +633,14 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
* 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->opts->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);
} }
/* write the "." and ".." entries first */ /* write the "." and ".." entries first */
if (t->rockridge) { if (t->opts->rockridge) {
ret = rrip_get_susp_fields(t, dir, 1, 34, &info); ret = rrip_get_susp_fields(t, dir, 1, 34, &info);
if (ret < 0) { if (ret < 0) {
goto ex; goto ex;
@ -650,7 +650,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
write_one_dir_record(t, dir, 0, buf, 1, &info, 0); write_one_dir_record(t, dir, 0, buf, 1, &info, 0);
buf += len; buf += len;
if (t->rockridge) { if (t->opts->rockridge) {
ret = rrip_get_susp_fields(t, dir, 2, 34, &info); ret = rrip_get_susp_fields(t, dir, 2, 34, &info);
if (ret < 0) { if (ret < 0) {
goto ex; goto ex;
@ -676,7 +676,7 @@ int write_one_dir(Ecma119Image *t, Ecma119Node *dir, Ecma119Node *parent)
} }
/* get the SUSP fields if rockridge is enabled */ /* get the SUSP fields if rockridge is enabled */
if (t->rockridge) { if (t->opts->rockridge) {
ret = rrip_get_susp_fields(t, child, 0, len, &info); ret = rrip_get_susp_fields(t, child, 0, len, &info);
if (ret < 0) { if (ret < 0) {
goto ex; goto ex;
@ -862,7 +862,8 @@ int ecma119_writer_write_dirs(IsoImageWriter *writer)
if (t->eff_partition_offset > 0) { if (t->eff_partition_offset > 0) {
root = t->partition_root; root = t->partition_root;
if ((t->md5_file_checksums & 1) || t->md5_session_checksum) { if ((t->opts->md5_file_checksums & 1) ||
t->opts->md5_session_checksum) {
/* Take into respect the address offset in "isofs.ca" */ /* Take into respect the address offset in "isofs.ca" */
ret = iso_node_lookup_attr((IsoNode *) t->image->root, "isofs.ca", ret = iso_node_lookup_attr((IsoNode *) t->image->root, "isofs.ca",
&value_length, &value, 0); &value_length, &value, 0);
@ -891,7 +892,7 @@ int ecma119_writer_write_dirs(IsoImageWriter *writer)
ret = write_path_tables(t); ret = write_path_tables(t);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (t->md5_session_checksum) { if (t->opts->md5_session_checksum) {
/* Write tree checksum tag */ /* Write tree checksum tag */
if (t->eff_partition_offset > 0) { if (t->eff_partition_offset > 0) {
/* >>> TWINTREE: >>> For now, tags are only for the /* >>> TWINTREE: >>> For now, tags are only for the
@ -934,15 +935,15 @@ int ecma119_writer_write_data(IsoImageWriter *writer)
if (ret < 0) if (ret < 0)
goto ex; goto ex;
if (t->partition_offset > 0) { if (t->opts->partition_offset > 0) {
t->eff_partition_offset = t->partition_offset; t->eff_partition_offset = t->opts->partition_offset;
ret = ecma119_writer_write_dirs(writer); ret = ecma119_writer_write_dirs(writer);
t->eff_partition_offset = 0; t->eff_partition_offset = 0;
if (ret < 0) if (ret < 0)
goto ex; goto ex;
} }
curblock = (t->bytes_written / 2048) + t->ms_block; curblock = (t->bytes_written / 2048) + t->opts->ms_block;
if (curblock != t->tree_end_block) { if (curblock != t->tree_end_block) {
LIBISO_ALLOC_MEM(msg, char, 100); LIBISO_ALLOC_MEM(msg, char, 100);
sprintf(msg, sprintf(msg,
@ -1000,9 +1001,9 @@ int ecma119_writer_create(Ecma119Image *target)
return ret; return ret;
} }
if(target->partition_offset > 0) { if(target->opts->partition_offset > 0) {
/* Create second tree */ /* Create second tree */
target->eff_partition_offset = target->partition_offset; target->eff_partition_offset = target->opts->partition_offset;
ret = ecma119_tree_create(target); ret = ecma119_tree_create(target);
target->eff_partition_offset = 0; target->eff_partition_offset = 0;
if (ret < 0) if (ret < 0)
@ -1025,7 +1026,7 @@ int mspad_writer_compute_data_blocks(IsoImageWriter *writer)
return ISO_ASSERT_FAILURE; return ISO_ASSERT_FAILURE;
} }
target = writer->target; target = writer->target;
min_size = 32 + target->partition_offset; min_size = 32 + target->opts->partition_offset;
if (target->curblock < min_size) { if (target->curblock < min_size) {
target->mspad_blocks = min_size - target->curblock; target->mspad_blocks = min_size - target->curblock;
target->curblock = min_size; target->curblock = min_size;
@ -1181,13 +1182,13 @@ int tail_writer_compute_data_blocks(IsoImageWriter *writer)
if (ret < 0) if (ret < 0)
return ret; return ret;
data = (struct iso_zero_writer_data_struct *) writer->data; data = (struct iso_zero_writer_data_struct *) writer->data;
if (data->num_blocks != target->tail_blocks) { if (data->num_blocks != target->opts->tail_blocks) {
sprintf(msg, "Aligned image size to cylinder size by %d blocks", sprintf(msg, "Aligned image size to cylinder size by %d blocks",
target->tail_blocks - data->num_blocks); target->opts->tail_blocks - data->num_blocks);
iso_msgs_submit(0, msg, 0, "NOTE", 0); iso_msgs_submit(0, msg, 0, "NOTE", 0);
data->num_blocks = target->tail_blocks; data->num_blocks = target->opts->tail_blocks;
} }
if (target->tail_blocks <= 0) if (target->opts->tail_blocks <= 0)
return ISO_SUCCESS; return ISO_SUCCESS;
ret = zero_writer_compute_data_blocks(writer); ret = zero_writer_compute_data_blocks(writer);
return ret; return ret;
@ -1371,12 +1372,12 @@ int write_head_part2(Ecma119Image *target, int *write_count, int flag)
uint8_t *buf = NULL; uint8_t *buf = NULL;
IsoImageWriter *writer; IsoImageWriter *writer;
if (target->partition_offset <= 0) if (target->opts->partition_offset <= 0)
{ret = ISO_SUCCESS; goto ex;} {ret = ISO_SUCCESS; goto ex;}
/* Write multi-session padding up to target->partition_offset + 16 */ /* Write multi-session padding up to target->opts->partition_offset + 16 */
LIBISO_ALLOC_MEM(buf, uint8_t, BLOCK_SIZE); LIBISO_ALLOC_MEM(buf, uint8_t, BLOCK_SIZE);
for(; *write_count < (int) target->partition_offset + 16; for(; *write_count < (int) target->opts->partition_offset + 16;
(*write_count)++) { (*write_count)++) {
ret = iso_write(target, buf, BLOCK_SIZE); ret = iso_write(target, buf, BLOCK_SIZE);
if (ret < 0) if (ret < 0)
@ -1386,7 +1387,7 @@ int write_head_part2(Ecma119Image *target, int *write_count, int flag)
/* Write volume descriptors subtracting /* Write volume descriptors subtracting
target->partiton_offset from any LBA pointer. target->partiton_offset from any LBA pointer.
*/ */
target->eff_partition_offset = target->partition_offset; target->eff_partition_offset = target->opts->partition_offset;
for (i = 0; i < (int) target->nwriters; ++i) { for (i = 0; i < (int) target->nwriters; ++i) {
writer = target->writers[i]; writer = target->writers[i];
/* Not all writers have an entry in the partion volume descriptor set. /* Not all writers have an entry in the partion volume descriptor set.
@ -1430,7 +1431,7 @@ int write_head_part(Ecma119Image *target, int flag)
return res; return res;
/* Write superblock checksum tag */ /* Write superblock checksum tag */
if (target->md5_session_checksum && target->checksum_ctx != NULL) { if (target->opts->md5_session_checksum && target->checksum_ctx != NULL) {
res = iso_md5_write_tag(target, 2); res = iso_md5_write_tag(target, 2);
if (res < 0) if (res < 0)
return res; return res;
@ -1452,10 +1453,10 @@ static int finish_libjte(Ecma119Image *target)
int ret; int ret;
if (target->libjte_handle != NULL) { if (target->opts->libjte_handle != NULL) {
ret = libjte_write_footer(target->libjte_handle); ret = libjte_write_footer(target->opts->libjte_handle);
if (ret <= 0) { if (ret <= 0) {
iso_libjte_forward_msgs(target->libjte_handle, iso_libjte_forward_msgs(target->opts->libjte_handle,
target->image->id, ISO_LIBJTE_END_FAILED, 0); target->image->id, ISO_LIBJTE_END_FAILED, 0);
return ISO_LIBJTE_END_FAILED; return ISO_LIBJTE_END_FAILED;
} }
@ -1561,11 +1562,12 @@ void *write_function(void *arg)
last_partition = 8; last_partition = 8;
} }
for (i = first_partition - 1; i <= last_partition - 1; i++) { for (i = first_partition - 1; i <= last_partition - 1; i++) {
if (target->appended_partitions[i] == NULL) if (target->opts->appended_partitions[i] == NULL)
continue; continue;
if (target->appended_partitions[i][0] == 0) if (target->opts->appended_partitions[i][0] == 0)
continue; continue;
res = iso_write_partition_file(target, target->appended_partitions[i], res = iso_write_partition_file(target,
target->opts->appended_partitions[i],
target->appended_part_prepad[i], target->appended_part_prepad[i],
target->appended_part_size[i], 0); target->appended_part_size[i], 0);
if (res < 0) if (res < 0)
@ -1615,7 +1617,7 @@ write_error: ;
target->eff_partition_offset = 0; target->eff_partition_offset = 0;
if (res == (int) ISO_CANCELED) { if (res == (int) ISO_CANCELED) {
/* canceled */ /* canceled */
if (!target->will_cancel) if (!target->opts->will_cancel)
iso_msg_submit(target->image->id, ISO_IMAGE_WRITE_CANCELED, iso_msg_submit(target->image->id, ISO_IMAGE_WRITE_CANCELED,
0, NULL); 0, NULL);
} else { } else {
@ -1701,7 +1703,7 @@ int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
no_md5 = 1; no_md5 = 1;
} }
} }
if (file->from_old_session && target->appendable) { if (file->from_old_session && target->opts->appendable) {
/* Save MD5 data of files from old image which will not /* Save MD5 data of files from old image which will not
be copied and have an MD5 recorded in the old image. */ be copied and have an MD5 recorded in the old image. */
has_xinfo = iso_node_get_xinfo(node, checksum_md5_xinfo_func, has_xinfo = iso_node_get_xinfo(node, checksum_md5_xinfo_func,
@ -1712,7 +1714,7 @@ int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
*/; */;
} else if (has_attr == 1 && img->checksum_array == NULL) { } else if (has_attr == 1 && img->checksum_array == NULL) {
/* No checksum array loaded. Delete "isofs.cx" */ /* No checksum array loaded. Delete "isofs.cx" */
if (!target->will_cancel) if (!target->opts->will_cancel)
iso_file_set_isofscx((IsoFile *) node, 0, 1); iso_file_set_isofscx((IsoFile *) node, 0, 1);
no_md5 = 1; no_md5 = 1;
} else if (!(has_attr == 1 && old_cx_value_length == 4)) { } else if (!(has_attr == 1 && old_cx_value_length == 4)) {
@ -1724,7 +1726,7 @@ int checksum_prepare_nodes(Ecma119Image *target, IsoNode *node, int flag)
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. Do not alter the nodes if this is only a will_cancel run.
*/ */
if (!(target->will_cancel || no_md5)) { if (!(target->opts->will_cancel || no_md5)) {
/* Record provisory new index */ /* Record provisory new index */
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)
@ -1745,18 +1747,19 @@ ex:;
} }
static static
int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img) int ecma119_image_new(IsoImage *src, IsoWriteOpts *in_opts, Ecma119Image **img)
{ {
int ret, i, voldesc_size, nwriters, tag_pos; int ret, i, voldesc_size, nwriters, tag_pos;
int sa_type; int sa_type;
Ecma119Image *target; Ecma119Image *target;
IsoWriteOpts *opts;
IsoImageWriter *writer; IsoImageWriter *writer;
int file_src_writer_index = -1; int file_src_writer_index = -1;
int system_area_options = 0; int system_area_options = 0;
char *system_area = NULL; char *system_area = NULL;
int write_count = 0, write_count_mem; int write_count = 0, write_count_mem;
/* 1. Allocate target and copy opts there */ /* 1. Allocate target and attach a copy of in_opts there */
target = calloc(1, sizeof(Ecma119Image)); target = calloc(1, sizeof(Ecma119Image));
if (target == NULL) { if (target == NULL) {
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
@ -1765,6 +1768,16 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
bs_free_data. bs_free_data.
*/ */
target->refcount = 1; target->refcount = 1;
target->opts = NULL;
/* Record a copy of in_opts.
It is a copy because in_opts is prone to manipulations from the
application thread while the image production thread is running.
*/
ret = iso_write_opts_clone(in_opts, &(target->opts), 0);
if (ret != ISO_SUCCESS)
goto target_cleanup;
opts = target->opts;
/* create the tree for file caching */ /* create the tree for file caching */
ret = iso_rbtree_new(iso_file_src_cmp, &(target->files)); ret = iso_rbtree_new(iso_file_src_cmp, &(target->files));
@ -1775,47 +1788,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
target->image = src; target->image = src;
iso_image_ref(src); iso_image_ref(src);
target->will_cancel = opts->will_cancel;
target->iso_level = opts->level;
target->rockridge = opts->rockridge;
target->joliet = opts->joliet;
target->hfsplus = opts->hfsplus;
target->fat = opts->fat;
target->iso1999 = opts->iso1999;
target->hardlinks = opts->hardlinks;
target->aaip = opts->aaip;
target->always_gmt = opts->always_gmt;
target->old_empty = opts->old_empty;
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;
target->allow_longer_paths = opts->allow_longer_paths;
target->max_37_char_filenames = opts->max_37_char_filenames;
target->no_force_dots = opts->no_force_dots;
target->allow_lowercase = opts->allow_lowercase;
target->allow_full_ascii = opts->allow_full_ascii;
target->allow_7bit_ascii = opts->allow_7bit_ascii;
target->relaxed_vol_atts = opts->relaxed_vol_atts;
target->joliet_longer_paths = opts->joliet_longer_paths;
target->joliet_long_names = opts->joliet_long_names;
target->joliet_utf16 = opts->joliet_utf16;
target->rrip_version_1_10 = opts->rrip_version_1_10;
target->rrip_1_10_px_ino = opts->rrip_1_10_px_ino;
target->aaip_susp_1_10 = opts->aaip_susp_1_10;
target->dir_rec_mtime = opts->dir_rec_mtime;
target->rr_reloc_dir = NULL;
if (opts->rr_reloc_dir != NULL) {
target->rr_reloc_dir = strdup(opts->rr_reloc_dir);
if (target->rr_reloc_dir == NULL) {
ret = ISO_OUT_OF_MEM;
goto target_cleanup;
}
}
target->rr_reloc_flags = opts->rr_reloc_flags;
target->rr_reloc_node = NULL; target->rr_reloc_node = NULL;
target->sort_files = opts->sort_files;
target->replace_uid = opts->replace_uid ? 1 : 0; target->replace_uid = opts->replace_uid ? 1 : 0;
target->replace_gid = opts->replace_gid ? 1 : 0; target->replace_gid = opts->replace_gid ? 1 : 0;
@ -1828,8 +1801,6 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
target->file_mode = opts->replace_file_mode == 2 ? opts->file_mode : 0444; target->file_mode = opts->replace_file_mode == 2 ? opts->file_mode : 0444;
target->now = time(NULL); target->now = time(NULL);
target->ms_block = opts->ms_block;
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 ?
@ -1881,13 +1852,6 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
} }
target->system_area_options = system_area_options; target->system_area_options = system_area_options;
target->vol_creation_time = opts->vol_creation_time;
target->vol_modification_time = opts->vol_modification_time;
target->vol_expiration_time = opts->vol_expiration_time;
target->vol_effective_time = opts->vol_effective_time;
strcpy(target->vol_uuid, opts->vol_uuid);
target->partition_offset = opts->partition_offset;
target->partition_secs_per_head = opts->partition_secs_per_head; target->partition_secs_per_head = opts->partition_secs_per_head;
target->partition_heads_per_cyl = opts->partition_heads_per_cyl; target->partition_heads_per_cyl = opts->partition_heads_per_cyl;
if (target->partition_secs_per_head == 0) if (target->partition_secs_per_head == 0)
@ -1917,12 +1881,6 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
goto target_cleanup; goto target_cleanup;
} }
memcpy(target->hfsp_serial_number, opts->hfsp_serial_number, 8);
target->md5_file_checksums = opts->md5_file_checksums;
target->md5_session_checksum = opts->md5_session_checksum;
strcpy(target->scdbackup_tag_parm, opts->scdbackup_tag_parm);
target->scdbackup_tag_written = opts->scdbackup_tag_written;
target->checksum_idx_counter = 0; target->checksum_idx_counter = 0;
target->checksum_ctx = NULL; target->checksum_ctx = NULL;
target->checksum_counter = 0; target->checksum_counter = 0;
@ -1939,12 +1897,10 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
#ifdef Libisofs_with_libjtE #ifdef Libisofs_with_libjtE
/* Eventually start Jigdo Template Extraction */ /* Eventually start Jigdo Template Extraction */
target->libjte_handle = NULL;
if (opts->libjte_handle != NULL) { if (opts->libjte_handle != NULL) {
target->libjte_handle = opts->libjte_handle; ret = libjte_write_header(opts->libjte_handle);
ret = libjte_write_header(target->libjte_handle);
if (ret <= 0) { if (ret <= 0) {
iso_libjte_forward_msgs(target->libjte_handle, iso_libjte_forward_msgs(opts->libjte_handle,
target->image->id, ISO_LIBJTE_START_FAILED, 0); target->image->id, ISO_LIBJTE_START_FAILED, 0);
ret = ISO_LIBJTE_START_FAILED; ret = ISO_LIBJTE_START_FAILED;
goto target_cleanup; goto target_cleanup;
@ -1953,8 +1909,6 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
#endif /* Libisofs_with_libjtE */ #endif /* Libisofs_with_libjtE */
target->tail_blocks = opts->tail_blocks;
target->mipsel_e_entry = 0; target->mipsel_e_entry = 0;
target->mipsel_p_offset = 0; target->mipsel_p_offset = 0;
target->mipsel_p_vaddr = 0; target->mipsel_p_vaddr = 0;
@ -1967,41 +1921,18 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
target->wthread_is_running = 0; target->wthread_is_running = 0;
target->prep_partition = NULL;
if (opts->prep_partition != NULL) {
target->prep_partition = strdup(opts->prep_partition);
if (target->prep_partition == NULL)
return ISO_OUT_OF_MEM;
}
target->prep_part_size = 0; target->prep_part_size = 0;
target->efi_boot_partition = NULL;
if (opts->efi_boot_partition != NULL) {
target->efi_boot_partition = strdup(opts->efi_boot_partition);
if (target->efi_boot_partition == NULL)
return ISO_OUT_OF_MEM;
}
target->efi_boot_part_size = 0; target->efi_boot_part_size = 0;
target->efi_boot_part_filesrc = NULL; target->efi_boot_part_filesrc = NULL;
for (i = 0; i < ISO_MAX_PARTITIONS; i++) { for (i = 0; i < ISO_MAX_PARTITIONS; i++) {
target->appended_partitions[i] = NULL;
if (opts->appended_partitions[i] != NULL) {
target->appended_partitions[i] =
strdup(opts->appended_partitions[i]);
if (target->appended_partitions[i] == NULL)
return ISO_OUT_OF_MEM;
target->appended_part_types[i] = opts->appended_part_types[i];
}
target->appended_part_prepad[i] = 0; target->appended_part_prepad[i] = 0;
target->appended_part_start[i] = target->appended_part_size[i] = 0; target->appended_part_start[i] = target->appended_part_size[i] = 0;
} }
strcpy(target->ascii_disc_label, opts->ascii_disc_label);
for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) { for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) {
target->hfsplus_blessed[i] = src->hfsplus_blessed[i]; target->hfsplus_blessed[i] = src->hfsplus_blessed[i];
if (target->hfsplus_blessed[i] != NULL) if (target->hfsplus_blessed[i] != NULL)
iso_node_ref(target->hfsplus_blessed[i]); iso_node_ref(target->hfsplus_blessed[i]);
} }
target->apm_block_size = opts->apm_block_size;
target->hfsp_block_size = opts->hfsp_block_size;
target->hfsp_cat_node_size = 0; target->hfsp_cat_node_size = 0;
target->hfsp_iso_block_fac = 0; target->hfsp_iso_block_fac = 0;
target->hfsp_collision_count = 0; target->hfsp_collision_count = 0;
@ -2035,10 +1966,10 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
* current block. * current block.
* Finally, create Writer for files. * Finally, create Writer for files.
*/ */
target->curblock = target->ms_block + 16; target->curblock = opts->ms_block + 16;
if (opts->overwrite != NULL && target->ms_block != 0 && if (opts->overwrite != NULL && opts->ms_block != 0 &&
target->ms_block < target->partition_offset + 32) { opts->ms_block < opts->partition_offset + 32) {
/* Not enough room for superblock relocation */ /* Not enough room for superblock relocation */
ret = ISO_OVWRT_MS_TOO_SMALL; ret = ISO_OVWRT_MS_TOO_SMALL;
goto target_cleanup; goto target_cleanup;
@ -2050,24 +1981,24 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
if (target->eltorito) { if (target->eltorito) {
nwriters++; nwriters++;
} }
if (target->joliet) { if (opts->joliet) {
nwriters++; nwriters++;
} }
if (target->iso1999) { if (opts->iso1999) {
nwriters++; nwriters++;
} }
nwriters++; /* Partition Prepend writer */ nwriters++; /* Partition Prepend writer */
if (target->hfsplus || target->fat) { if (opts->hfsplus || opts->fat) {
nwriters+= 2; nwriters+= 2;
} }
nwriters++; /* GPT backup tail writer */ nwriters++; /* GPT backup tail writer */
nwriters++; /* Tail padding writer */ nwriters++; /* Tail padding writer */
if ((target->md5_file_checksums & 1) || target->md5_session_checksum) { if ((opts->md5_file_checksums & 1) || opts->md5_session_checksum) {
nwriters++; nwriters++;
ret = checksum_prepare_image(src, 0); ret = checksum_prepare_image(src, 0);
if (ret < 0) if (ret < 0)
goto target_cleanup; goto target_cleanup;
if (target->appendable) { if (opts->appendable) {
ret = checksum_prepare_nodes(target, (IsoNode *) src->root, 0); ret = checksum_prepare_nodes(target, (IsoNode *) src->root, 0);
if (ret < 0) if (ret < 0)
goto target_cleanup; goto target_cleanup;
@ -2096,7 +2027,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
} }
/* create writer for Joliet structure */ /* create writer for Joliet structure */
if (target->joliet) { if (opts->joliet) {
ret = joliet_writer_create(target); ret = joliet_writer_create(target);
if (ret < 0) { if (ret < 0) {
goto target_cleanup; goto target_cleanup;
@ -2104,14 +2035,14 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
} }
/* create writer for ISO 9660:1999 structure */ /* create writer for ISO 9660:1999 structure */
if (target->iso1999) { if (opts->iso1999) {
ret = iso1999_writer_create(target); ret = iso1999_writer_create(target);
if (ret < 0) { if (ret < 0) {
goto target_cleanup; goto target_cleanup;
} }
} }
voldesc_size = target->curblock - target->ms_block - 16; voldesc_size = target->curblock - opts->ms_block - 16;
/* Volume Descriptor Set Terminator */ /* Volume Descriptor Set Terminator */
target->curblock++; target->curblock++;
@ -2142,7 +2073,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
/* create writer for HFS+/FAT structure */ /* create writer for HFS+/FAT structure */
/* Impotant: It must be created directly before iso_file_src_writer_create. /* Impotant: It must be created directly before iso_file_src_writer_create.
*/ */
if (target->hfsplus || target->fat) { if (opts->hfsplus || opts->fat) {
ret = hfsplus_writer_create(target); ret = hfsplus_writer_create(target);
if (ret < 0) { if (ret < 0) {
goto target_cleanup; goto target_cleanup;
@ -2157,7 +2088,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
file_src_writer_index = target->nwriters - 1; file_src_writer_index = target->nwriters - 1;
/* create writer for HFS+ structure */ /* create writer for HFS+ structure */
if (target->hfsplus || target->fat) { if (opts->hfsplus || opts->fat) {
ret = hfsplus_tail_writer_create(target); ret = hfsplus_tail_writer_create(target);
if (ret < 0) { if (ret < 0) {
goto target_cleanup; goto target_cleanup;
@ -2188,13 +2119,13 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
/* >>> ??? Why is this important ? */ /* >>> ??? Why is this important ? */
/* IMPORTANT: This must be the last writer before the checksum writer */ /* IMPORTANT: This must be the last writer before the checksum writer */
ret = zero_writer_create(target, target->tail_blocks, 1); ret = zero_writer_create(target, opts->tail_blocks, 1);
if (ret < 0) if (ret < 0)
goto target_cleanup; goto target_cleanup;
#endif /* !Libisofs_checksums_before_paddinG */ #endif /* !Libisofs_checksums_before_paddinG */
if ((target->md5_file_checksums & 1) || target->md5_session_checksum) { if ((opts->md5_file_checksums & 1) || opts->md5_session_checksum) {
ret = checksum_writer_create(target); ret = checksum_writer_create(target);
if (ret < 0) if (ret < 0)
goto target_cleanup; goto target_cleanup;
@ -2202,7 +2133,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
#ifdef Libisofs_checksums_before_paddinG #ifdef Libisofs_checksums_before_paddinG
ret = zero_writer_create(target, target->tail_blocks, 1); ret = zero_writer_create(target, opts->tail_blocks, 1);
if (ret < 0) if (ret < 0)
goto target_cleanup; goto target_cleanup;
@ -2223,17 +2154,16 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
goto target_cleanup; goto target_cleanup;
#endif /* Libisofs_gpt_writer_lasT */ #endif /* Libisofs_gpt_writer_lasT */
if (target->partition_offset > 0) { if (opts->partition_offset > 0) {
/* After volume descriptors and superblock tag are accounted for: /* After volume descriptors and superblock tag are accounted for:
account for second volset account for second volset
*/ */
if (target->ms_block + target->partition_offset + 16 if (opts->ms_block + opts->partition_offset + 16 < target->curblock) {
< target->curblock) {
/* Overflow of partition system area */ /* Overflow of partition system area */
ret = ISO_PART_OFFST_TOO_SMALL; ret = ISO_PART_OFFST_TOO_SMALL;
goto target_cleanup; goto target_cleanup;
} }
target->curblock = target->ms_block + target->partition_offset + 16; target->curblock = opts->ms_block + opts->partition_offset + 16;
/* Account for partition tree volume descriptors */ /* Account for partition tree volume descriptors */
for (i = 0; i < (int) target->nwriters; ++i) { for (i = 0; i < (int) target->nwriters; ++i) {
@ -2281,9 +2211,9 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
will account resp. write this single block. will account resp. write this single block.
*/ */
if (i == file_src_writer_index) { if (i == file_src_writer_index) {
if (! target->old_empty) if (! opts->old_empty)
target->empty_file_block = target->curblock; target->empty_file_block = target->curblock;
opts->data_start_lba = target->curblock; in_opts->data_start_lba = opts->data_start_lba = target->curblock;
} }
ret = writer->compute_data_blocks(writer); ret = writer->compute_data_blocks(writer);
@ -2305,7 +2235,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
* The volume space size is just the size of the last session, in * The volume space size is just the size of the last session, in
* case of ms images. * case of ms images.
*/ */
target->vol_space_size = target->curblock - target->ms_block; target->vol_space_size = target->curblock - opts->ms_block;
target->total_size = (off_t) target->vol_space_size * BLOCK_SIZE; target->total_size = (off_t) target->vol_space_size * BLOCK_SIZE;
/* Add sizes of eventually appended partitions */ /* Add sizes of eventually appended partitions */
@ -2315,7 +2245,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
/* create the ring buffer */ /* create the ring buffer */
if (opts->overwrite != NULL && if (opts->overwrite != NULL &&
opts->fifo_size < 32 + target->partition_offset) { opts->fifo_size < 32 + opts->partition_offset) {
/* The ring buffer must be large enough to take opts->overwrite /* The ring buffer must be large enough to take opts->overwrite
*/ */
ret = ISO_OVWRT_FIFO_TOO_SMALL; ret = ISO_OVWRT_FIFO_TOO_SMALL;
@ -2359,7 +2289,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
/* Write relocated superblock checksum tag */ /* Write relocated superblock checksum tag */
tag_pos = voldesc_size / BLOCK_SIZE + 16 + 1; tag_pos = voldesc_size / BLOCK_SIZE + 16 + 1;
if (target->md5_session_checksum) { if (opts->md5_session_checksum) {
target->checksum_rlsb_tag_pos = tag_pos; target->checksum_rlsb_tag_pos = tag_pos;
if (target->checksum_rlsb_tag_pos < 32) { if (target->checksum_rlsb_tag_pos < 32) {
ret = iso_md5_start(&(target->checksum_ctx)); ret = iso_md5_start(&(target->checksum_ctx));
@ -2408,7 +2338,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
} }
/* This was possibly altered by above overwrite buffer production */ /* This was possibly altered by above overwrite buffer production */
target->vol_space_size = target->curblock - target->ms_block; target->vol_space_size = target->curblock - opts->ms_block;
/* /*
*/ */
@ -2425,7 +2355,7 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
/* 4. Create and start writing thread */ /* 4. Create and start writing thread */
if (target->md5_session_checksum) { if (opts->md5_session_checksum) {
/* After any fake writes are done: Initialize image checksum context */ /* After any fake writes are done: Initialize image checksum context */
if (target->checksum_ctx != NULL) if (target->checksum_ctx != NULL)
iso_md5_end(&(target->checksum_ctx), target->image_md5); iso_md5_end(&(target->checksum_ctx), target->image_md5);
@ -2434,11 +2364,11 @@ int ecma119_image_new(IsoImage *src, IsoWriteOpts *opts, Ecma119Image **img)
goto target_cleanup; goto target_cleanup;
} }
if (target->apm_block_size == 0) { if (opts->apm_block_size == 0) {
if (target->gpt_req_count) if (target->gpt_req_count)
target->apm_block_size = 2048; /* Combinable with GPT */ opts->apm_block_size = 2048; /* Combinable with GPT */
else else
target->apm_block_size = 512; /* Mountable on Linux */ opts->apm_block_size = 512; /* Mountable on Linux */
} }
/* ensure the thread is created joinable */ /* ensure the thread is created joinable */
@ -2751,14 +2681,14 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
switch (profile) { switch (profile) {
case 0: case 0:
wopts->level = 1; wopts->iso_level = 1;
break; break;
case 1: case 1:
wopts->level = 3; wopts->iso_level = 3;
wopts->rockridge = 1; wopts->rockridge = 1;
break; break;
case 2: case 2:
wopts->level = 2; wopts->iso_level = 2;
wopts->rockridge = 1; wopts->rockridge = 1;
wopts->joliet = 1; wopts->joliet = 1;
wopts->replace_dir_mode = 1; wopts->replace_dir_mode = 1;
@ -2782,6 +2712,7 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
wopts->rr_reloc_dir = NULL; wopts->rr_reloc_dir = NULL;
wopts->rr_reloc_flags = 0; wopts->rr_reloc_flags = 0;
wopts->system_area_data = NULL; wopts->system_area_data = NULL;
wopts->system_area_size = 0;
wopts->system_area_options = 0; wopts->system_area_options = 0;
wopts->vol_creation_time = 0; wopts->vol_creation_time = 0;
wopts->vol_modification_time = 0; wopts->vol_modification_time = 0;
@ -2815,6 +2746,54 @@ int iso_write_opts_new(IsoWriteOpts **opts, int profile)
return ISO_SUCCESS; return ISO_SUCCESS;
} }
int iso_write_opts_clone(IsoWriteOpts *in, IsoWriteOpts **out, int flag)
{
int ret, i;
IsoWriteOpts *o = NULL;
ret = iso_write_opts_new(&o, 0);
if (ret != 1)
return ret;
*out = o;
/* Provisory copy of all values and un-managed pointers */
memcpy(o, in, sizeof(IsoWriteOpts));
/* Set managed pointers to NULL */
o->output_charset = NULL;
o->rr_reloc_dir = NULL;
o->system_area_data = NULL;
o->prep_partition = NULL;
o->efi_boot_partition = NULL;
for (i = 0; i < ISO_MAX_PARTITIONS; i++)
o->appended_partitions[i] = NULL;
/* Clone managed objects */
if (iso_clone_mem(in->output_charset, &(o->output_charset), 0) != 1)
goto out_of_mem;
if (iso_clone_mem(in->rr_reloc_dir, &(o->rr_reloc_dir), 0) != 1)
goto out_of_mem;
if (iso_clone_mem(in->system_area_data, &(o->system_area_data),
in->system_area_size) != 1)
goto out_of_mem;
if (iso_clone_mem(in->prep_partition, &(o->prep_partition), 0) != 1)
goto out_of_mem;
if (iso_clone_mem(in->efi_boot_partition, &(o->efi_boot_partition), 0)
!= 1)
goto out_of_mem;
for (i = 0; i < ISO_MAX_PARTITIONS; i++)
if (iso_clone_mem(in->appended_partitions[i],
&(o->appended_partitions[i]), 0) != 1)
goto out_of_mem;
return ISO_SUCCESS;
out_of_mem:;
if (o != NULL)
iso_write_opts_free(o);
return ISO_OUT_OF_MEM;
}
void iso_write_opts_free(IsoWriteOpts *opts) void iso_write_opts_free(IsoWriteOpts *opts)
{ {
int i; int i;
@ -2855,7 +2834,7 @@ int iso_write_opts_set_iso_level(IsoWriteOpts *opts, int level)
if (level != 1 && level != 2 && level != 3) { if (level != 1 && level != 2 && level != 3) {
return ISO_WRONG_ARG_VALUE; return ISO_WRONG_ARG_VALUE;
} }
opts->level = level; opts->iso_level = level;
return ISO_SUCCESS; return ISO_SUCCESS;
} }
@ -3348,6 +3327,7 @@ int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
if (opts->system_area_data != NULL) if (opts->system_area_data != NULL)
free(opts->system_area_data); free(opts->system_area_data);
opts->system_area_data = NULL; opts->system_area_data = NULL;
opts->system_area_size = 0;
} else if (!(flag & 2)) { } else if (!(flag & 2)) {
if (opts->system_area_data == NULL) { if (opts->system_area_data == NULL) {
opts->system_area_data = calloc(32768, 1); opts->system_area_data = calloc(32768, 1);
@ -3355,6 +3335,7 @@ int iso_write_opts_set_system_area(IsoWriteOpts *opts, char data[32768],
return ISO_OUT_OF_MEM; return ISO_OUT_OF_MEM;
} }
memcpy(opts->system_area_data, data, 32768); memcpy(opts->system_area_data, data, 32768);
opts->system_area_size = 32768;
} }
if (!(flag & 4)) if (!(flag & 4))
opts->system_area_options = options & 0x7fff; opts->system_area_options = options & 0x7fff;

View File

@ -100,7 +100,7 @@ struct iso_write_opts {
int will_cancel; int will_cancel;
int level; /**< ISO level to write at. (ECMA-119, 10) */ int iso_level; /**< ISO level to write at. (ECMA-119, 10) */
/** Which extensions to support. */ /** Which extensions to support. */
unsigned int rockridge :1; unsigned int rockridge :1;
@ -431,6 +431,7 @@ struct iso_write_opts {
* See ecma119_image : System Area related information * See ecma119_image : System Area related information
*/ */
char *system_area_data; char *system_area_data;
int system_area_size;
int system_area_options; int system_area_options;
/* User settable PVD time stamps */ /* User settable PVD time stamps */
@ -513,73 +514,19 @@ struct ecma119_image
IsoImage *image; IsoImage *image;
Ecma119Node *root; Ecma119Node *root;
int will_cancel :1; IsoWriteOpts *opts;
unsigned int iso_level :2; /** Whether El Torito data will be produced */
/* extensions */
unsigned int rockridge :1;
unsigned int joliet :1;
unsigned int eltorito :1; unsigned int eltorito :1;
unsigned int iso1999 :1;
unsigned int hfsplus :1;
unsigned int fat :1;
unsigned int hardlinks:1; /* see iso_write_opts_set_hardlinks() */ /* The ECMA-119 directory node where to store Rock Ridge relocated
directories. (Path is in IsoWriteOpts.rr_reloc_dir)
unsigned int aaip :1; /* see iso_write_opts_set_aaip() */
/* allways write timestamps in GMT */
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;
unsigned int max_37_char_filenames :1;
unsigned int no_force_dots :2;
unsigned int allow_lowercase :1;
unsigned int allow_full_ascii :1;
unsigned int allow_7bit_ascii :1;
unsigned int relaxed_vol_atts : 1;
/** Allow paths on Joliet tree to be larger than 240 bytes */
unsigned int joliet_longer_paths :1;
/** Allow Joliet names up to 103 characters rather than 64 */
unsigned int joliet_long_names :1;
/** Use UTF-16BE rather than its subset UCS-2 */
unsigned int joliet_utf16 :1;
/** Write old fashioned RRIP-1.10 rather than RRIP-1.12 */
unsigned int rrip_version_1_10 :1;
/** Write field PX with file serial number even with RRIP-1.10 */
unsigned int rrip_1_10_px_ino :1;
/* Write AAIP as extension according to SUSP 1.10 rather than SUSP 1.12. */
unsigned int aaip_susp_1_10 :1;
/* Store in ECMA-119, Joliet, ISO 9660:1999 timestamp the mtime of source
bit0= ECMA-119, bit1= Joliet, bit2= ISO 9660:1999.
*/ */
unsigned int dir_rec_mtime :3;
/* The ECMA-119 directory where to store Rock Ridge relocated directories.
*/
char *rr_reloc_dir; /* IsoNode name in root directory */
int rr_reloc_flags;
Ecma119Node *rr_reloc_node; /* Directory node in ecma119_image */ Ecma119Node *rr_reloc_node; /* Directory node in ecma119_image */
unsigned int md5_session_checksum :1;
unsigned int md5_file_checksums :2;
/* /*
* Mode replace. If one of these flags is set, the correspodent values are * Mode replace. If one of these flags is set, the correspodent values are
* replaced with values below. * replaced with values below. Both get computed from IsoWriteOpts.
*/ */
unsigned int replace_uid :1; unsigned int replace_uid :1;
unsigned int replace_gid :1; unsigned int replace_gid :1;
@ -587,30 +534,17 @@ struct ecma119_image
unsigned int replace_dir_mode :1; unsigned int replace_dir_mode :1;
unsigned int replace_timestamps :1; unsigned int replace_timestamps :1;
/* Mode replacement values. */
uid_t uid; uid_t uid;
gid_t gid; gid_t gid;
mode_t file_mode; mode_t file_mode;
mode_t dir_mode; mode_t dir_mode;
time_t timestamp; time_t timestamp;
unsigned int old_empty :1; /* Effective charsets */
unsigned int untranslated_name_len;
/**
* if sort files or not. Sorting is based of the weight of each file
*/
int sort_files;
char *input_charset; char *input_charset;
char *output_charset; char *output_charset;
/* See iso_write_opts and iso_write_opts_set_hfsp_serial_number().
* 00...00 means that it shall be generated by libisofs.
*/
uint8_t hfsp_serial_number[8];
unsigned int appendable : 1;
uint32_t ms_block; /**< start block for a ms image */
time_t now; /**< Time at which writing began. */ time_t now; /**< Time at which writing began. */
/** Total size of the output. This only includes the current volume. */ /** Total size of the output. This only includes the current volume. */
@ -778,14 +712,6 @@ struct ecma119_image
Use only underneath ecma119_image_new() Use only underneath ecma119_image_new()
and if not NULL*/ and if not NULL*/
/* ??? Is there a reason why we copy lots of items from IsoWriteOpts
rather than taking ownership of the IsoWriteOpts object which
is submitted with ecma119_image_new() ?
*/
char scdbackup_tag_parm[100];
char *scdbackup_tag_written;
/* Buffer for communication between burn_source and writer thread */ /* Buffer for communication between burn_source and writer thread */
IsoRingBuffer *buffer; IsoRingBuffer *buffer;
@ -794,20 +720,7 @@ struct ecma119_image
int wthread_is_running; int wthread_is_running;
pthread_attr_t th_attr; pthread_attr_t th_attr;
/* User settable PVD time stamps */ /* Effective partition table parameter: 1 to 63, 0= disabled/default */
time_t vol_creation_time;
time_t vol_modification_time;
time_t vol_expiration_time;
time_t vol_effective_time;
/* To eventually override vol_creation_time and vol_modification_time
* by unconverted string with timezone 0
*/
char vol_uuid[17];
/* The number of unclaimed 2K blocks before
start of partition 1 as of the MBR in system area. */
uint32_t partition_offset;
/* Partition table parameter: 1 to 63, 0= disabled/default */
int partition_secs_per_head; int partition_secs_per_head;
/* 1 to 255, 0= disabled/default */ /* 1 to 255, 0= disabled/default */
int partition_heads_per_cyl; int partition_heads_per_cyl;
@ -828,12 +741,6 @@ struct ecma119_image
uint32_t j_part_l_path_table_pos; uint32_t j_part_l_path_table_pos;
uint32_t j_part_m_path_table_pos; uint32_t j_part_m_path_table_pos;
#ifdef Libisofs_with_libjtE
struct libjte_env *libjte_handle;
#endif /* Libisofs_with_libjtE */
uint32_t tail_blocks;
/* Memorized ELF parameters from MIPS Little Endian boot file */ /* Memorized ELF parameters from MIPS Little Endian boot file */
uint32_t mipsel_e_entry; uint32_t mipsel_e_entry;
uint32_t mipsel_p_offset; uint32_t mipsel_p_offset;
@ -845,15 +752,11 @@ struct ecma119_image
*/ */
IsoFileSrc *sparc_core_src; IsoFileSrc *sparc_core_src;
char *appended_partitions[ISO_MAX_PARTITIONS];
uint8_t appended_part_types[ISO_MAX_PARTITIONS];
/* Counted in blocks of 2048 */ /* Counted in blocks of 2048 */
uint32_t appended_part_prepad[ISO_MAX_PARTITIONS]; uint32_t appended_part_prepad[ISO_MAX_PARTITIONS];
uint32_t appended_part_start[ISO_MAX_PARTITIONS]; uint32_t appended_part_start[ISO_MAX_PARTITIONS];
uint32_t appended_part_size[ISO_MAX_PARTITIONS]; uint32_t appended_part_size[ISO_MAX_PARTITIONS];
char ascii_disc_label[ISO_DISC_LABEL_SIZE];
/* See IsoImage and libisofs.h */ /* See IsoImage and libisofs.h */
IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX]; IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
@ -861,15 +764,10 @@ struct ecma119_image
Only change a block size if it is 0. Set only to 512 or 2048. Only change a block size if it is 0. Set only to 512 or 2048.
If it stays 0 then it will become 512 or 2048 in time. If it stays 0 then it will become 512 or 2048 in time.
*/ */
/* Blocksize of Apple Partition Map
May be defined to 512 or 2048 before writer thread starts.
*/
int apm_block_size;
/* Allocation block size of HFS+ /* Allocation block size of HFS+
May be defined to 512 or 2048 before hfsplus_writer_create(). May be defined to 512 or 2048 before hfsplus_writer_create().
*/ */
int hfsp_block_size;
int hfsp_cat_node_size; /* 2 * apm_block_size */ int hfsp_cat_node_size; /* 2 * apm_block_size */
int hfsp_iso_block_fac; /* 2048 / apm_block_size */ int hfsp_iso_block_fac; /* 2048 / apm_block_size */
@ -892,7 +790,6 @@ struct ecma119_image
struct iso_mbr_partition_request *mbr_req[ISO_MBR_ENTRIES_MAX]; struct iso_mbr_partition_request *mbr_req[ISO_MBR_ENTRIES_MAX];
int mbr_req_count; int mbr_req_count;
char *prep_partition;
uint32_t prep_part_size; uint32_t prep_part_size;
/* GPT description. To be composed during IsoImageWriter /* GPT description. To be composed during IsoImageWriter
@ -905,7 +802,6 @@ struct ecma119_image
/* bit0= GPT partitions may overlap */ /* bit0= GPT partitions may overlap */
int gpt_req_flags; int gpt_req_flags;
char *efi_boot_partition;
uint32_t efi_boot_part_size; uint32_t efi_boot_part_size;
IsoFileSrc *efi_boot_part_filesrc; /* Just a pointer. Do not free. */ IsoFileSrc *efi_boot_part_filesrc; /* Just a pointer. Do not free. */

View File

@ -32,16 +32,17 @@
static static
int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name) int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
{ {
int ret, relaxed, free_ascii_name= 0, force_dots = 0; int ret, relaxed, free_ascii_name = 0, force_dots = 0;
char *ascii_name; char *ascii_name;
char *isoname= NULL; char *isoname = NULL;
IsoWriteOpts *opts = img->opts;
if (iso->name == NULL) { if (iso->name == NULL) {
/* it is not necessarily an error, it can be the root */ /* it is not necessarily an error, it can be the root */
return ISO_SUCCESS; return ISO_SUCCESS;
} }
if (img->untranslated_name_len > 0) { if (opts->untranslated_name_len > 0) {
ascii_name = iso->name; ascii_name = iso->name;
ret = 1; ret = 1;
} else { } else {
@ -54,27 +55,27 @@ int get_iso_name(Ecma119Image *img, IsoNode *iso, char **name)
return ret; return ret;
} }
if (img->allow_full_ascii) { if (opts->allow_full_ascii) {
relaxed = 2; relaxed = 2;
} else { } else {
relaxed = (int)img->allow_lowercase; relaxed = (int)opts->allow_lowercase;
} }
if (img->allow_7bit_ascii) if (opts->allow_7bit_ascii)
relaxed |= 4; relaxed |= 4;
if (iso->type == LIBISO_DIR && !(img->allow_dir_id_ext)) { if (iso->type == LIBISO_DIR && !(opts->allow_dir_id_ext)) {
if (img->untranslated_name_len > 0) { if (opts->untranslated_name_len > 0) {
if (strlen(ascii_name) > img->untranslated_name_len) { if (strlen(ascii_name) > opts->untranslated_name_len) {
needs_transl:; needs_transl:;
iso_msg_submit(img->image->id, ISO_NAME_NEEDS_TRANSL, 0, iso_msg_submit(img->image->id, ISO_NAME_NEEDS_TRANSL, 0,
"File name too long (%d > %d) for untranslated recording: '%s'", "File name too long (%d > %d) for untranslated recording: '%s'",
strlen(ascii_name), img->untranslated_name_len, strlen(ascii_name), opts->untranslated_name_len,
ascii_name); ascii_name);
return ISO_NAME_NEEDS_TRANSL; return ISO_NAME_NEEDS_TRANSL;
} }
isoname = strdup(ascii_name); isoname = strdup(ascii_name);
} else if (img->max_37_char_filenames) { } else if (opts->max_37_char_filenames) {
isoname = iso_r_dirid(ascii_name, 37, relaxed); isoname = iso_r_dirid(ascii_name, 37, relaxed);
} else if (img->iso_level == 1) { } else if (opts->iso_level == 1) {
#ifdef Libisofs_old_ecma119_nameS #ifdef Libisofs_old_ecma119_nameS
@ -99,14 +100,15 @@ needs_transl:;
} }
} }
} else { } else {
force_dots = !((img->no_force_dots & 1) || iso->type == LIBISO_DIR); force_dots = !((opts->no_force_dots & 1) ||
if (img->untranslated_name_len > 0) { iso->type == LIBISO_DIR);
if (strlen(ascii_name) > img->untranslated_name_len) if (opts->untranslated_name_len > 0) {
if (strlen(ascii_name) > opts->untranslated_name_len)
goto needs_transl; goto needs_transl;
isoname = strdup(ascii_name); isoname = strdup(ascii_name);
} else if (img->max_37_char_filenames) { } else if (opts->max_37_char_filenames) {
isoname = iso_r_fileid(ascii_name, 36, relaxed, force_dots); isoname = iso_r_fileid(ascii_name, 36, relaxed, force_dots);
} else if (img->iso_level == 1) { } else if (opts->iso_level == 1) {
#ifdef Libisofs_old_ecma119_nameS #ifdef Libisofs_old_ecma119_nameS
@ -155,7 +157,7 @@ int ecma119_is_dedicated_reloc_dir(Ecma119Image *img, Ecma119Node *node)
{ {
if (img->rr_reloc_node == node && if (img->rr_reloc_node == node &&
node != img->root && node != img->partition_root && node != img->root && node != img->partition_root &&
(img->rr_reloc_flags & 2)) (img->opts->rr_reloc_flags & 2))
return 1; return 1;
return 0; return 0;
} }
@ -220,7 +222,7 @@ int create_file_src(Ecma119Image *img, IsoFile *iso, IsoFileSrc **src)
off_t size; off_t size;
size = iso_stream_get_size(iso->stream); size = iso_stream_get_size(iso->stream);
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && img->iso_level != 3) { if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && img->opts->iso_level != 3) {
char *ipath = iso_tree_get_node_path(ISO_NODE(iso)); char *ipath = iso_tree_get_node_path(ISO_NODE(iso));
ret = iso_msg_submit(img->image->id, ISO_FILE_TOO_BIG, 0, ret = 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 "
@ -361,6 +363,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
int max_path; int max_path;
char *iso_name= NULL, *ipath = NULL; char *iso_name= NULL, *ipath = NULL;
IsoFileSrc *src = NULL; IsoFileSrc *src = NULL;
IsoWriteOpts *opts = image->opts;
if (image == NULL || iso == NULL || tree == NULL) { if (image == NULL || iso == NULL || tree == NULL) {
return ISO_NULL_POINTER; return ISO_NULL_POINTER;
@ -385,16 +388,16 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
goto ex; goto ex;
} }
max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0); max_path = pathlen + 1 + (iso_name ? strlen(iso_name) : 0);
if (!image->rockridge) { if (!opts->rockridge) {
if ((iso->type == LIBISO_DIR && depth > 8) && if ((iso->type == LIBISO_DIR && depth > 8) &&
!image->allow_deep_paths) { !opts->allow_deep_paths) {
ipath = iso_tree_get_node_path(iso); ipath = iso_tree_get_node_path(iso);
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG, ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
0, "File \"%s\" can't be added, " 0, "File \"%s\" can't be added, "
"because directory depth " "because directory depth "
"is greater than 8.", ipath); "is greater than 8.", ipath);
goto ex; goto ex;
} else if (max_path > 255 && !image->allow_longer_paths) { } else if (max_path > 255 && !opts->allow_longer_paths) {
ipath = iso_tree_get_node_path(iso); ipath = iso_tree_get_node_path(iso);
ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG, ret = iso_msg_submit(image->image->id, ISO_FILE_IMGPATH_WRONG,
0, "File \"%s\" can't be added, " 0, "File \"%s\" can't be added, "
@ -418,7 +421,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
ret = 0; /* Hidden means non-existing */ ret = 0; /* Hidden means non-existing */
goto ex; goto ex;
} }
if (image->rockridge) { if (opts->rockridge) {
ret = create_symlink(image, (IsoSymlink*)iso, &node); ret = create_symlink(image, (IsoSymlink*)iso, &node);
} else { } else {
/* symlinks are only supported when RR is enabled */ /* symlinks are only supported when RR is enabled */
@ -434,7 +437,7 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
ret = 0; /* Hidden means non-existing */ ret = 0; /* Hidden means non-existing */
goto ex; goto ex;
} }
if (image->rockridge) { if (opts->rockridge) {
ret = create_special(image, (IsoSpecial*)iso, &node); ret = create_special(image, (IsoSpecial*)iso, &node);
} else { } else {
/* special files are only supported when RR is enabled */ /* special files are only supported when RR is enabled */
@ -472,9 +475,9 @@ int create_tree(Ecma119Image *image, IsoNode *iso, Ecma119Node **tree,
image->rr_reloc_node = node; image->rr_reloc_node = node;
} else if (depth == 2) { } else if (depth == 2) {
/* Directories in root may be used as relocation dir */ /* Directories in root may be used as relocation dir */
if (image->rr_reloc_dir != NULL) if (opts->rr_reloc_dir != NULL)
if (image->rr_reloc_dir[0] != 0 && if (opts->rr_reloc_dir[0] != 0 &&
strcmp(iso->name, image->rr_reloc_dir) == 0) strcmp(iso->name, opts->rr_reloc_dir) == 0)
image->rr_reloc_node = node; image->rr_reloc_node = node;
} }
} }
@ -606,7 +609,7 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
continue; continue;
} }
if (img->untranslated_name_len) { if (img->opts->untranslated_name_len) {
/* This should not happen because no two IsoNode names should be /* This should not happen because no two IsoNode names should be
identical and only unaltered IsoNode names should be seen here. identical and only unaltered IsoNode names should be seen here.
Thus the Ema119Node names should be unique. Thus the Ema119Node names should be unique.
@ -635,7 +638,8 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len,
/* compute name and extension */ /* compute name and extension */
dot = strrchr(full_name, '.'); dot = strrchr(full_name, '.');
if (dot != NULL && if (dot != NULL &&
(children[i]->type != ECMA119_DIR || img->allow_dir_id_ext)) { (children[i]->type != ECMA119_DIR ||
img->opts->allow_dir_id_ext)) {
/* /*
* File (normally not dir) with extension * File (normally not dir) with extension
@ -801,11 +805,11 @@ int mangle_tree(Ecma119Image *img, Ecma119Node *dir, int recurse)
int max_file, max_dir; int max_file, max_dir;
Ecma119Node *root; Ecma119Node *root;
if (img->untranslated_name_len > 0) { if (img->opts->untranslated_name_len > 0) {
max_file = max_dir = img->untranslated_name_len; max_file = max_dir = img->opts->untranslated_name_len;
} else if (img->max_37_char_filenames) { } else if (img->opts->max_37_char_filenames) {
max_file = max_dir = 37; max_file = max_dir = 37;
} else if (img->iso_level == 1) { } else if (img->opts->iso_level == 1) {
max_file = 12; /* 8 + 3 + 1 */ max_file = 12; /* 8 + 3 + 1 */
max_dir = 8; max_dir = 8;
} else { } else {
@ -973,9 +977,9 @@ int reorder_tree(Ecma119Image *img, Ecma119Node *dir,
/* dir is now the relocated Ecma119Node */ /* dir is now the relocated Ecma119Node */
pathlen = 37 + 1; /* The dir name might get longer by mangling */ pathlen = 37 + 1; /* The dir name might get longer by mangling */
level = 2; level = 2;
if (img->rr_reloc_dir != NULL) { if (img->opts->rr_reloc_dir != NULL) {
pathlen += strlen(img->rr_reloc_node->iso_name) + 1; pathlen += strlen(img->rr_reloc_node->iso_name) + 1;
if(img->rr_reloc_dir[0] != 0) if(img->opts->rr_reloc_dir[0] != 0)
level = 3; level = 3;
} }
} }
@ -1128,7 +1132,7 @@ int match_hardlinks(Ecma119Image *img, Ecma119Node *dir, int flag)
goto ex; goto ex;
/* Sort according to id tuples, IsoFileSrc identity, properties, xattr. */ /* Sort according to id tuples, IsoFileSrc identity, properties, xattr. */
if (img->hardlinks) if (img->opts->hardlinks)
qsort(nodes, node_count, sizeof(Ecma119Node *), ecma119_node_cmp_hard); qsort(nodes, node_count, sizeof(Ecma119Node *), ecma119_node_cmp_hard);
else else
qsort(nodes, node_count, sizeof(Ecma119Node *), qsort(nodes, node_count, sizeof(Ecma119Node *),
@ -1198,7 +1202,7 @@ int ecma119_tree_create(Ecma119Image *img)
return ret; return ret;
} }
if (img->rockridge && !img->allow_deep_paths) { if (img->opts->rockridge && !img->opts->allow_deep_paths) {
/* Relocate deep directories, acording to RRIP, 4.1.5 */ /* Relocate deep directories, acording to RRIP, 4.1.5 */
ret = reorder_tree(img, root, 1, 0); ret = reorder_tree(img, root, 1, 0);

View File

@ -1126,7 +1126,7 @@ int patch_boot_info_table(uint8_t *buf, Ecma119Image *t,
return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0, return iso_msg_submit(t->image->id, ISO_ISOLINUX_CANT_PATCH, 0,
"Isolinux image too small. We won't patch it."); "Isolinux image too small. We won't patch it.");
} }
ret = make_boot_info_table(buf, t->ms_block + (uint32_t) 16, ret = make_boot_info_table(buf, t->opts->ms_block + (uint32_t) 16,
t->bootsrc[idx]->sections[0].block, t->bootsrc[idx]->sections[0].block,
(uint32_t) imgsize); (uint32_t) imgsize);
return ret; return ret;
@ -1302,8 +1302,8 @@ int eltorito_writer_create(Ecma119Image *target)
} }
} }
if (target->efi_boot_partition != NULL) if (target->opts->efi_boot_partition != NULL)
if (strcmp(target->efi_boot_partition, "--efi-boot-image") == 0) if (strcmp(target->opts->efi_boot_partition, "--efi-boot-image") == 0)
outsource_efi = 1; outsource_efi = 1;
for (idx = 0; idx < target->catalog->num_bootimages; idx++) { for (idx = 0; idx < target->catalog->num_bootimages; idx++) {
bootimg = target->catalog->bootimages[idx]->image; bootimg = target->catalog->bootimages[idx]->image;
@ -1337,8 +1337,8 @@ int eltorito_writer_create(Ecma119Image *target)
if (outsource_efi) { if (outsource_efi) {
/* Disable EFI Boot partition and complain */ /* Disable EFI Boot partition and complain */
free(target->efi_boot_partition); free(target->opts->efi_boot_partition);
target->efi_boot_partition = NULL; target->opts->efi_boot_partition = NULL;
iso_msg_submit(target->image->id, ISO_BOOT_NO_EFI_ELTO, 0, iso_msg_submit(target->image->id, ISO_BOOT_NO_EFI_ELTO, 0,
"No newly added El Torito EFI boot image found for exposure as GPT partition"); "No newly added El Torito EFI boot image found for exposure as GPT partition");
return ISO_BOOT_NO_EFI_ELTO; return ISO_BOOT_NO_EFI_ELTO;

View File

@ -88,8 +88,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
} }
/* fill key and other atts */ /* fill key and other atts */
fsrc->no_write = (file->from_old_session && img->appendable); fsrc->no_write = (file->from_old_session && img->opts->appendable);
if (file->from_old_session && img->appendable) { if (file->from_old_session && img->opts->appendable) {
/* /*
* On multisession discs we keep file sections from old image. * On multisession discs we keep file sections from old image.
*/ */
@ -127,7 +127,8 @@ 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 && !img->will_cancel) { if (ret == 0 && (*src)->checksum_index > 0 &&
!img->opts->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);
@ -140,8 +141,8 @@ int iso_file_src_create(Ecma119Image *img, IsoFile *file, IsoFileSrc **src)
} }
iso_stream_ref(fsrc->stream); iso_stream_ref(fsrc->stream);
if ((img->md5_file_checksums & 1) && if ((img->opts->md5_file_checksums & 1) &&
file->from_old_session && img->appendable) { file->from_old_session && img->opts->appendable) {
ret = iso_node_get_xinfo((IsoNode *) file, checksum_md5_xinfo_func, ret = iso_node_get_xinfo((IsoNode *) file, checksum_md5_xinfo_func,
&xipt); &xipt);
if (ret <= 0) if (ret <= 0)
@ -152,7 +153,8 @@ 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 || img->will_cancel)) { if ((img->opts->md5_file_checksums & 1) &&
!(no_md5 || img->opts->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;
@ -244,11 +246,11 @@ int filesrc_writer_pre_compute(IsoImageWriter *writer)
/* Normally reserve a single zeroed block for all files which have /* Normally reserve a single zeroed block for all files which have
no block address: symbolic links, device files, empty data files. no block address: symbolic links, device files, empty data files.
*/ */
if (! t->old_empty) if (! t->opts->old_empty)
t->filesrc_blocks++; t->filesrc_blocks++;
/* on appendable images, ms files shouldn't be included */ /* on appendable images, ms files shouldn't be included */
if (t->appendable) { if (t->opts->appendable) {
inc_item = shall_be_written; inc_item = shall_be_written;
} else { } else {
inc_item = NULL; inc_item = NULL;
@ -261,7 +263,7 @@ int filesrc_writer_pre_compute(IsoImageWriter *writer)
} }
/* sort files by weight, if needed */ /* sort files by weight, if needed */
if (t->sort_files) { if (t->opts->sort_files) {
qsort(filelist, size, sizeof(void*), cmp_by_weight); qsort(filelist, size, sizeof(void*), cmp_by_weight);
} }
@ -436,7 +438,7 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
file_size = iso_file_src_get_size(file); file_size = iso_file_src_get_size(file);
nblocks = DIV_UP(file_size, BLOCK_SIZE); nblocks = DIV_UP(file_size, BLOCK_SIZE);
pre_md5_valid = 0; pre_md5_valid = 0;
if (file->checksum_index > 0 && (t->md5_file_checksums & 2)) { if (file->checksum_index > 0 && (t->opts->md5_file_checksums & 2)) {
/* Obtain an MD5 of content by a first read pass */ /* Obtain an MD5 of content by a first read pass */
pre_md5_valid = filesrc_make_md5(t, file, pre_md5, 0); pre_md5_valid = filesrc_make_md5(t, file, pre_md5, 0);
} }
@ -494,11 +496,11 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
/* >>> HFS: need to align to allocation block size */; /* >>> HFS: need to align to allocation block size */;
#ifdef Libisofs_with_libjtE #ifdef Libisofs_with_libjtE
if (t->libjte_handle != NULL) { if (t->opts->libjte_handle != NULL) {
res = libjte_begin_data_file(t->libjte_handle, name, res = libjte_begin_data_file(t->opts->libjte_handle, name,
BLOCK_SIZE, file_size); BLOCK_SIZE, file_size);
if (res <= 0) { if (res <= 0) {
res = iso_libjte_forward_msgs(t->libjte_handle, t->image->id, res = iso_libjte_forward_msgs(t->opts->libjte_handle, t->image->id,
ISO_LIBJTE_FILE_FAILED, 0); ISO_LIBJTE_FILE_FAILED, 0);
if (res < 0) { if (res < 0) {
filesrc_close(file); filesrc_close(file);
@ -593,7 +595,7 @@ int iso_filesrc_write_data(Ecma119Image *t, IsoFileSrc *file,
res = iso_md5_end(&ctx, md5); res = iso_md5_end(&ctx, md5);
if (res <= 0) if (res <= 0)
file->checksum_index = 0; file->checksum_index = 0;
if ((t->md5_file_checksums & 2) && pre_md5_valid > 0 && if ((t->opts->md5_file_checksums & 2) && pre_md5_valid > 0 &&
!was_error) { !was_error) {
if (! iso_md5_match(md5, pre_md5)) { if (! iso_md5_match(md5, pre_md5)) {
/* Issue MISHAP event */ /* Issue MISHAP event */
@ -619,8 +621,8 @@ ex:;
#ifdef Libisofs_with_libjtE #ifdef Libisofs_with_libjtE
if (jte_begun) { if (jte_begun) {
res = libjte_end_data_file(t->libjte_handle); res = libjte_end_data_file(t->opts->libjte_handle);
iso_libjte_forward_msgs(t->libjte_handle, t->image->id, iso_libjte_forward_msgs(t->opts->libjte_handle, t->image->id,
ISO_LIBJTE_END_FAILED, 0); ISO_LIBJTE_END_FAILED, 0);
if (res <= 0 && ret >= 0) if (res <= 0 && ret >= 0)
ret = ISO_LIBJTE_FILE_FAILED; ret = ISO_LIBJTE_FILE_FAILED;
@ -658,7 +660,7 @@ int filesrc_writer_write_data(IsoImageWriter *writer)
files which have no block address: files which have no block address:
symbolic links, device files, empty data files. symbolic links, device files, empty data files.
*/ */
if (! t->old_empty) { if (! t->opts->old_empty) {
ret = iso_write(t, buffer, BLOCK_SIZE); ret = iso_write(t, buffer, BLOCK_SIZE);
if (ret < 0) if (ret < 0)
goto ex; goto ex;

View File

@ -429,7 +429,7 @@ int hfsplus_tail_writer_compute_data_blocks(IsoImageWriter *writer)
} }
t = writer->target; t = writer->target;
block_size = t->hfsp_block_size; block_size = t->opts->hfsp_block_size;
block_fac = t->hfsp_iso_block_fac; block_fac = t->hfsp_iso_block_fac;
#ifdef Libisofs_ts_debuG #ifdef Libisofs_ts_debuG
@ -485,7 +485,7 @@ int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer)
} }
t = writer->target; t = writer->target;
block_size = t->hfsp_block_size; block_size = t->opts->hfsp_block_size;
block_fac = t->hfsp_iso_block_fac; block_fac = t->hfsp_iso_block_fac;
iso_msg_debug(t->image->id, "(b) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes); iso_msg_debug(t->image->id, "(b) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes);
@ -582,7 +582,7 @@ write_sb (Ecma119Image *t)
iso_msg_debug(t->image->id, "Write HFS+ superblock"); iso_msg_debug(t->image->id, "Write HFS+ superblock");
block_size = t->hfsp_block_size; block_size = t->opts->hfsp_block_size;
memset (buffer, 0, sizeof (buffer)); memset (buffer, 0, sizeof (buffer));
ret = iso_write(t, buffer, 1024); ret = iso_write(t, buffer, 1024);
@ -642,7 +642,7 @@ write_sb (Ecma119Image *t)
} }
memcpy (&sb.num_serial, &t->hfsp_serial_number, 8); memcpy (&sb.num_serial, &t->opts->hfsp_serial_number, 8);
ret = iso_write(t, &sb, sizeof (sb)); ret = iso_write(t, &sb, sizeof (sb));
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -665,7 +665,7 @@ int hfsplus_writer_write_data(IsoImageWriter *writer)
} }
t = writer->target; t = writer->target;
block_size = t->hfsp_block_size; block_size = t->opts->hfsp_block_size;
block_fac = t->hfsp_iso_block_fac; block_fac = t->hfsp_iso_block_fac;
cat_node_size = t->hfsp_cat_node_size; cat_node_size = t->hfsp_cat_node_size;
@ -1033,7 +1033,7 @@ int hfsplus_tail_writer_write_data(IsoImageWriter *writer)
} }
t = writer->target; t = writer->target;
block_size = t->hfsp_block_size; block_size = t->opts->hfsp_block_size;
#ifdef Libisofs_ts_debuG #ifdef Libisofs_ts_debuG
iso_msg_debug(t->image->id, "hfsplus tail writer writes at = %.f", iso_msg_debug(t->image->id, "hfsplus tail writer writes at = %.f",
@ -1579,10 +1579,10 @@ int hfsplus_writer_create(Ecma119Image *target)
make_hfsplus_decompose_pages(); make_hfsplus_decompose_pages();
make_hfsplus_class_pages(); make_hfsplus_class_pages();
if (target->hfsp_block_size == 0) if (target->opts->hfsp_block_size == 0)
target->hfsp_block_size = HFSPLUS_DEFAULT_BLOCK_SIZE; target->opts->hfsp_block_size = HFSPLUS_DEFAULT_BLOCK_SIZE;
target->hfsp_cat_node_size = 2 * target->hfsp_block_size; target->hfsp_cat_node_size = 2 * target->opts->hfsp_block_size;
target->hfsp_iso_block_fac = 2048 / target->hfsp_block_size; target->hfsp_iso_block_fac = 2048 / target->opts->hfsp_block_size;
cat_node_size = target->hfsp_cat_node_size; cat_node_size = target->hfsp_cat_node_size;
writer->compute_data_blocks = hfsplus_writer_compute_data_blocks; writer->compute_data_blocks = hfsplus_writer_compute_data_blocks;

View File

@ -125,7 +125,7 @@ int create_node(Ecma119Image *t, IsoNode *iso, Iso1999Node **node)
IsoFile *file = (IsoFile*) iso; IsoFile *file = (IsoFile*) iso;
size = iso_stream_get_size(file->stream); size = iso_stream_get_size(file->stream);
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->iso_level != 3) { if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->opts->iso_level != 3) {
char *ipath = iso_tree_get_node_path(iso); char *ipath = iso_tree_get_node_path(iso);
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0, ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
"File \"%s\" can't be added to image because is " "File \"%s\" can't be added to image because is "
@ -194,7 +194,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, Iso1999Node **tree, int pathlen)
} }
max_path = pathlen + 1 + (iso_name ? strlen(iso_name): 0); max_path = pathlen + 1 + (iso_name ? strlen(iso_name): 0);
if (!t->allow_longer_paths && max_path > 255) { if (!t->opts->allow_longer_paths && max_path > 255) {
char *ipath = iso_tree_get_node_path(iso); char *ipath = iso_tree_get_node_path(iso);
ret = iso_msg_submit(t->image->id, ISO_FILE_IMGPATH_WRONG, 0, ret = iso_msg_submit(t->image->id, ISO_FILE_IMGPATH_WRONG, 0,
"File \"%s\" can't be added to ISO 9660:1999 tree, " "File \"%s\" can't be added to ISO 9660:1999 tree, "
@ -722,13 +722,13 @@ void write_one_dir_record(Ecma119Image *t, Iso1999Node *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);
/* was: iso_datetime_7(rec->recording_time, t->now, t->always_gmt); /* was: iso_datetime_7(rec->recording_time, t->now, t->opts->always_gmt);
*/ */
iso= node->node; iso= node->node;
iso_datetime_7(rec->recording_time, iso_datetime_7(rec->recording_time,
(t->dir_rec_mtime & 4) ? ( t->replace_timestamps ? (t->opts->dir_rec_mtime & 4) ? ( t->replace_timestamps ?
t->timestamp : iso->mtime ) t->timestamp : iso->mtime )
: t->now, t->always_gmt); : t->now, t->opts->always_gmt);
rec->flags[0] = ((node->type == ISO1999_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0); rec->flags[0] = ((node->type == ISO1999_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2); iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);

View File

@ -41,7 +41,7 @@ int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
return ISO_SUCCESS; return ISO_SUCCESS;
} }
if (t->joliet_utf16) { if (t->opts->joliet_utf16) {
ret = str2utf16be(t->input_charset, iso->name, &ucs_name); ret = str2utf16be(t->input_charset, iso->name, &ucs_name);
if (ret < 0) { if (ret < 0) {
iso_msg_debug(t->image->id, "Cannot convert to UTF-16 : \"%s\"", iso_msg_debug(t->image->id, "Cannot convert to UTF-16 : \"%s\"",
@ -68,10 +68,10 @@ int get_joliet_name(Ecma119Image *t, IsoNode *iso, uint16_t **name)
} }
} }
if (iso->type == LIBISO_DIR) { if (iso->type == LIBISO_DIR) {
jname = iso_j_dir_id(ucs_name, t->joliet_long_names << 1); jname = iso_j_dir_id(ucs_name, t->opts->joliet_long_names << 1);
} else { } else {
jname = iso_j_file_id(ucs_name, jname = iso_j_file_id(ucs_name,
(t->joliet_long_names << 1) | !!(t->no_force_dots & 2)); (t->opts->joliet_long_names << 1) | !!(t->opts->no_force_dots & 2));
} }
ret = ISO_SUCCESS; ret = ISO_SUCCESS;
ex:; ex:;
@ -151,7 +151,8 @@ int create_node(Ecma119Image *t, IsoNode *iso, JolietNode **node)
IsoFile *file = (IsoFile*) iso; IsoFile *file = (IsoFile*) iso;
size = iso_stream_get_size(file->stream); size = iso_stream_get_size(file->stream);
if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE && t->iso_level != 3) { if (size > (off_t)MAX_ISO_FILE_SECTION_SIZE &&
t->opts->iso_level != 3) {
char *ipath = iso_tree_get_node_path(iso); char *ipath = iso_tree_get_node_path(iso);
free(joliet); free(joliet);
ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0, ret = iso_msg_submit(t->image->id, ISO_FILE_TOO_BIG, 0,
@ -219,7 +220,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, JolietNode **tree, int pathlen)
return ret; return ret;
} }
max_path = pathlen + 1 + (jname ? ucslen(jname) * 2 : 0); max_path = pathlen + 1 + (jname ? ucslen(jname) * 2 : 0);
if (!t->joliet_longer_paths && max_path > 240) { if (!t->opts->joliet_longer_paths && max_path > 240) {
char *ipath = iso_tree_get_node_path(iso); char *ipath = iso_tree_get_node_path(iso);
/* /*
* Wow!! Joliet is even more restrictive than plain ISO-9660, * Wow!! Joliet is even more restrictive than plain ISO-9660,
@ -280,7 +281,7 @@ int create_tree(Ecma119Image *t, IsoNode *iso, JolietNode **tree, int pathlen)
{ {
char *ipath = iso_tree_get_node_path(iso); char *ipath = iso_tree_get_node_path(iso);
ret = iso_msg_submit(t->image->id, ISO_FILE_IGNORED, 0, ret = iso_msg_submit(t->image->id, ISO_FILE_IGNORED, 0,
"Can't add %s to Joliet tree. %s can only be added to a " "Cannot add %s to Joliet tree. %s can only be added to a "
"Rock Ridge tree.", ipath, (iso->type == LIBISO_SYMLINK ? "Rock Ridge tree.", ipath, (iso->type == LIBISO_SYMLINK ?
"Symlinks" : "Special files")); "Symlinks" : "Special files"));
free(ipath); free(ipath);
@ -390,7 +391,7 @@ int mangle_single_dir(Ecma119Image *t, JolietNode *dir)
nchildren = dir->info.dir->nchildren; nchildren = dir->info.dir->nchildren;
children = dir->info.dir->children; children = dir->info.dir->children;
if (t->joliet_long_names) if (t->opts->joliet_long_names)
maxchar = 103; maxchar = 103;
/* a hash table will temporary hold the names, for fast searching */ /* a hash table will temporary hold the names, for fast searching */
@ -629,7 +630,7 @@ size_t calc_dirent_len(Ecma119Image *t, JolietNode *n)
{ {
/* note than name len is always even, so we always need the pad byte */ /* note than name len is always even, so we always need the pad byte */
int ret = n->name ? ucslen(n->name) * 2 + 34 : 34; int ret = n->name ? ucslen(n->name) * 2 + 34 : 34;
if (n->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) { if (n->type == JOLIET_FILE && !(t->opts->omit_version_numbers & 3)) {
/* take into account version numbers */ /* take into account version numbers */
ret += 4; ret += 4;
} }
@ -748,7 +749,7 @@ int joliet_writer_compute_data_blocks(IsoImageWriter *writer)
t->curblock += DIV_UP(path_table_size, BLOCK_SIZE); t->curblock += DIV_UP(path_table_size, BLOCK_SIZE);
t->joliet_path_table_size = path_table_size; t->joliet_path_table_size = path_table_size;
if (t->partition_offset > 0) { if (t->opts->partition_offset > 0) {
/* Take into respect second directory tree */ /* Take into respect second directory tree */
ndirs = t->joliet_ndirs; ndirs = t->joliet_ndirs;
t->joliet_ndirs = 0; t->joliet_ndirs = 0;
@ -797,7 +798,7 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
memcpy(rec->file_id, name, len_fi); memcpy(rec->file_id, name, len_fi);
if (node->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) { if (node->type == JOLIET_FILE && !(t->opts->omit_version_numbers & 3)) {
len_dr += 4; len_dr += 4;
rec->file_id[len_fi++] = 0; rec->file_id[len_fi++] = 0;
rec->file_id[len_fi++] = ';'; rec->file_id[len_fi++] = ';';
@ -832,13 +833,13 @@ void write_one_dir_record(Ecma119Image *t, JolietNode *node, int file_id,
iso_bb(rec->block, block - t->eff_partition_offset, 4); iso_bb(rec->block, block - t->eff_partition_offset, 4);
iso_bb(rec->length, len, 4); iso_bb(rec->length, len, 4);
/* was: iso_datetime_7(rec->recording_time, t->now, t->always_gmt); /* was: iso_datetime_7(rec->recording_time, t->now, t->opts->always_gmt);
*/ */
iso= node->node; iso= node->node;
iso_datetime_7(rec->recording_time, iso_datetime_7(rec->recording_time,
(t->dir_rec_mtime & 2) ? ( t->replace_timestamps ? (t->opts->dir_rec_mtime & 2) ? ( t->replace_timestamps ?
t->timestamp : iso->mtime ) t->timestamp : iso->mtime )
: t->now, t->always_gmt); : t->now, t->opts->always_gmt);
rec->flags[0] = ((node->type == JOLIET_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0); rec->flags[0] = ((node->type == JOLIET_DIR) ? 2 : 0) | (multi_extend ? 0x80 : 0);
iso_bb(rec->vol_seq_number, (uint32_t) 1, 2); iso_bb(rec->vol_seq_number, (uint32_t) 1, 2);
@ -993,7 +994,8 @@ int write_one_dir(Ecma119Image *t, JolietNode *dir)
/* compute len of directory entry */ /* compute len of directory entry */
fi_len = ucslen(child->name) * 2; fi_len = ucslen(child->name) * 2;
len = fi_len + 34; len = fi_len + 34;
if (child->type == JOLIET_FILE && !(t->omit_version_numbers & 3)) { if (child->type == JOLIET_FILE &&
!(t->opts->omit_version_numbers & 3)) {
len += 4; len += 4;
} }
@ -1195,8 +1197,8 @@ int joliet_writer_write_data(IsoImageWriter *writer)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (t->partition_offset > 0) { if (t->opts->partition_offset > 0) {
t->eff_partition_offset = t->partition_offset; t->eff_partition_offset = t->opts->partition_offset;
ret = joliet_writer_write_dirs(writer); ret = joliet_writer_write_dirs(writer);
t->eff_partition_offset = 0; t->eff_partition_offset = 0;
if (ret < 0) if (ret < 0)
@ -1244,9 +1246,9 @@ int joliet_writer_create(Ecma119Image *target)
/* add this writer to image */ /* add this writer to image */
target->writers[target->nwriters++] = writer; target->writers[target->nwriters++] = writer;
if(target->partition_offset > 0) { if(target->opts->partition_offset > 0) {
/* Create second tree */ /* Create second tree */
target->eff_partition_offset = target->partition_offset; target->eff_partition_offset = target->opts->partition_offset;
ret = joliet_tree_create(target); ret = joliet_tree_create(target);
if (ret < 0) { if (ret < 0) {
return ret; return ret;

View File

@ -455,7 +455,7 @@ int assess_isohybrid_gpt_apm(Ecma119Image *t, int *gpt_count, int gpt_idx[128],
return ret; return ret;
/* Prevent gap filling */ /* Prevent gap filling */
t->apm_req_flags |= 2; t->apm_req_flags |= 2;
t->apm_block_size = 2048; t->opts->apm_block_size = 2048;
} }
} }
} }

View File

@ -497,7 +497,7 @@ int checksum_copy_old_nodes(Ecma119Image *target, IsoNode *node, int flag)
if (node->type == LIBISO_FILE) { if (node->type == LIBISO_FILE) {
file = (IsoFile *) node; file = (IsoFile *) node;
if (file->from_old_session && target->appendable) { if (file->from_old_session && target->opts->appendable) {
/* Look for checksums at various places */ /* Look for checksums at various places */
/* Try checksum directly stored with node */ /* Try checksum directly stored with node */
@ -527,7 +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) { if (!target->opts->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) {
@ -571,8 +571,8 @@ int checksum_writer_compute_data_blocks(IsoImageWriter *writer)
t = writer->target; t = writer->target;
t->checksum_array_pos = t->curblock; t->checksum_array_pos = t->curblock;
/* (t->curblock already contains t->ms_block) */ /* (t->curblock already contains t->opts->ms_block) */
t->checksum_range_start = t->ms_block; t->checksum_range_start = t->opts->ms_block;
size = (t->checksum_idx_counter + 2) / 128; size = (t->checksum_idx_counter + 2) / 128;
if (size * 128 < t->checksum_idx_counter + 2) if (size * 128 < t->checksum_idx_counter + 2)
size++; size++;
@ -712,7 +712,7 @@ int checksum_writer_create(Ecma119Image *target)
/* add this writer to image */ /* add this writer to image */
target->writers[target->nwriters++] = writer; target->writers[target->nwriters++] = writer;
/* Account for superblock checksum tag */ /* Account for superblock checksum tag */
if (target->md5_session_checksum) { if (target->opts->md5_session_checksum) {
target->checksum_sb_tag_pos = target->curblock; target->checksum_sb_tag_pos = target->curblock;
target->curblock++; target->curblock++;
} }
@ -742,7 +742,7 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
(unsigned int) (pos % 1000000000)); (unsigned int) (pos % 1000000000));
else else
sprintf(postext, "%u", (unsigned int) pos); sprintf(postext, "%u", (unsigned int) pos);
sprintf(record, "%s %s ", t->scdbackup_tag_parm, postext); sprintf(record, "%s %s ", t->opts->scdbackup_tag_parm, postext);
record_len = strlen(record); record_len = strlen(record);
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
sprintf(record + record_len + 2 * i, sprintf(record + record_len + 2 * i,
@ -764,8 +764,8 @@ int iso_md5_write_scdbackup_tag(Ecma119Image *t, char *tag_block, int flag)
block_len+= 32; block_len+= 32;
tag_block[block_len++]= '\n'; tag_block[block_len++]= '\n';
if (t->scdbackup_tag_written != NULL) if (t->opts->scdbackup_tag_written != NULL)
strncpy(t->scdbackup_tag_written, tag_block + line_start, strncpy(t->opts->scdbackup_tag_written, tag_block + line_start,
block_len - line_start); block_len - line_start);
ret = ISO_SUCCESS; ret = ISO_SUCCESS;
ex:; ex:;
@ -827,7 +827,7 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
} else if (mode == 3) { } else if (mode == 3) {
sprintf(tag_block + l, " next=%u", t->checksum_tag_pos); sprintf(tag_block + l, " next=%u", t->checksum_tag_pos);
} else if (mode == 4) { } else if (mode == 4) {
sprintf(tag_block + l, " session_start=%u", t->ms_block); sprintf(tag_block + l, " session_start=%u", t->opts->ms_block);
} }
strcat(tag_block + l, " md5="); strcat(tag_block + l, " md5=");
l = strlen(tag_block); l = strlen(tag_block);
@ -848,8 +848,8 @@ int iso_md5_write_tag(Ecma119Image *t, int flag)
} }
tag_block[l + 32] = '\n'; tag_block[l + 32] = '\n';
if (mode == 1 && t->scdbackup_tag_parm[0]) { if (mode == 1 && t->opts->scdbackup_tag_parm[0]) {
if (t->ms_block > 0) { if (t->opts->ms_block > 0) {
iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL); iso_msg_submit(t->image->id, ISO_SCDBACKUP_TAG_NOT_0, 0, NULL);
} else { } else {
ret = iso_md5_write_scdbackup_tag(t, tag_block, 0); ret = iso_md5_write_scdbackup_tag(t, tag_block, 0);

View File

@ -115,7 +115,7 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
PX[0] = 'P'; PX[0] = 'P';
PX[1] = 'X'; PX[1] = 'X';
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10 ) { if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10 ) {
PX[2] = 44; PX[2] = 44;
} else { } else {
PX[2] = 36; PX[2] = 36;
@ -125,7 +125,7 @@ int rrip_add_PX(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
iso_bb(&PX[12], (uint32_t) n->nlink, 4); iso_bb(&PX[12], (uint32_t) n->nlink, 4);
iso_bb(&PX[20], (uint32_t) px_get_uid(t, n), 4); iso_bb(&PX[20], (uint32_t) px_get_uid(t, n), 4);
iso_bb(&PX[28], (uint32_t) px_get_gid(t, n), 4); iso_bb(&PX[28], (uint32_t) px_get_gid(t, n), 4);
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10) { if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10) {
iso_bb(&PX[36], (uint32_t) n->ino, 4); iso_bb(&PX[36], (uint32_t) n->ino, 4);
} }
@ -153,11 +153,11 @@ int rrip_add_TF(Ecma119Image *t, Ecma119Node *n, struct susp_info *susp)
iso = n->node; iso = n->node;
iso_datetime_7(&TF[5], t->replace_timestamps ? t->timestamp : iso->mtime, iso_datetime_7(&TF[5], t->replace_timestamps ? t->timestamp : iso->mtime,
t->always_gmt); t->opts->always_gmt);
iso_datetime_7(&TF[12], t->replace_timestamps ? t->timestamp : iso->atime, iso_datetime_7(&TF[12], t->replace_timestamps ? t->timestamp : iso->atime,
t->always_gmt); t->opts->always_gmt);
iso_datetime_7(&TF[19], t->replace_timestamps ? t->timestamp : iso->ctime, iso_datetime_7(&TF[19], t->replace_timestamps ? t->timestamp : iso->ctime,
t->always_gmt); t->opts->always_gmt);
return susp_append(t, susp, TF); return susp_append(t, susp, TF);
} }
@ -542,7 +542,7 @@ int aaip_add_AL(Ecma119Image *t, struct susp_info *susp,
int ret, done = 0, len, es_extra = 0; int ret, done = 0, len, es_extra = 0;
uint8_t *aapt, *cpt; uint8_t *aapt, *cpt;
if (!t->aaip_susp_1_10) if (!t->opts->aaip_susp_1_10)
es_extra = 5; es_extra = 5;
if (*sua_free < num_data + es_extra || *ce_len > 0) { if (*sua_free < num_data + es_extra || *ce_len > 0) {
*ce_len += num_data + es_extra; *ce_len += num_data + es_extra;
@ -553,7 +553,7 @@ int aaip_add_AL(Ecma119Image *t, struct susp_info *susp,
return ISO_SUCCESS; return ISO_SUCCESS;
/* If AAIP enabled and announced by ER : Write ES field to announce AAIP */ /* If AAIP enabled and announced by ER : Write ES field to announce AAIP */
if (t->aaip && !t->aaip_susp_1_10) { if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
ret = susp_add_ES(t, susp, (*ce_len > 0), 1); ret = susp_add_ES(t, susp, (*ce_len > 0), 1);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -606,7 +606,7 @@ int rrip_add_ER(Ecma119Image *t, struct susp_info *susp)
{ {
unsigned char *ER; unsigned char *ER;
if (!t->rrip_version_1_10) { if (!t->opts->rrip_version_1_10) {
/* /*
According to RRIP 1.12 this is the future form: According to RRIP 1.12 this is the future form:
4.3 "Specification of the ER System Use Entry Values for RRIP" 4.3 "Specification of the ER System Use Entry Values for RRIP"
@ -851,7 +851,7 @@ int add_zf_field(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
zisofs file header when inquired) zisofs file header when inquired)
*/ */
if (t->appendable && file->from_old_session) if (t->opts->appendable && file->from_old_session)
will_copy = 0; will_copy = 0;
first_filter = first_stream = last_stream = iso_file_get_stream(file); first_filter = first_stream = last_stream = iso_file_get_stream(file);
@ -1124,7 +1124,7 @@ int susp_calc_nm_sl_al(Ecma119Image *t, Ecma119Node *n, size_t space,
/* obtain num_aapt from node */ /* obtain num_aapt from node */
xipt = NULL; xipt = NULL;
num_aapt = 0; num_aapt = 0;
if (t->aaip) { if (t->opts->aaip) {
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt); ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
if (ret == 1) { if (ret == 1) {
num_aapt = aaip_count_bytes((unsigned char *) xipt, 0); num_aapt = aaip_count_bytes((unsigned char *) xipt, 0);
@ -1160,7 +1160,7 @@ int add_aa_string(Ecma119Image *t, Ecma119Node *n, struct susp_info *info,
void *xipt; void *xipt;
size_t num_aapt= 0; size_t num_aapt= 0;
if (!t->aaip) if (!t->opts->aaip)
return 1; return 1;
ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt); ret = iso_node_get_xinfo(n->node, aaip_xinfo_func, &xipt);
@ -1221,7 +1221,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
su_size = 0; su_size = 0;
/* If AAIP enabled and announced by ER : account for 5 bytes of ES */; /* If AAIP enabled and announced by ER : account for 5 bytes of ES */;
if (t->aaip && !t->aaip_susp_1_10) if (t->opts->aaip && !t->opts->aaip_susp_1_10)
su_size += 5; su_size += 5;
#ifdef Libisofs_with_rrip_rR #ifdef Libisofs_with_rrip_rR
@ -1230,7 +1230,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
#endif #endif
/* PX and TF, we are sure they always fit in SUA */ /* PX and TF, we are sure they always fit in SUA */
if (t->rrip_1_10_px_ino || !t->rrip_version_1_10) { if (t->opts->rrip_1_10_px_ino || !t->opts->rrip_version_1_10) {
su_size += 44 + 26; su_size += 44 + 26;
} else { } else {
su_size += 36 + 26; su_size += 36 + 26;
@ -1247,7 +1247,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
su_size += 4; su_size += 4;
} }
} else if(ecma119_is_dedicated_reloc_dir(t, n) && } else if(ecma119_is_dedicated_reloc_dir(t, n) &&
(t->rr_reloc_flags & 1)) { (t->opts->rr_reloc_flags & 1)) {
/* The dedicated relocation directory shall be marked by RE */ /* The dedicated relocation directory shall be marked by RE */
su_size += 4; su_size += 4;
} }
@ -1274,7 +1274,7 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
/* "." or ".." entry */ /* "." or ".." entry */
if (!t->rrip_version_1_10) if (!t->opts->rrip_version_1_10)
su_size += 5; /* NM field */ su_size += 5; /* NM field */
if (type == 1 && n->parent == NULL) { if (type == 1 && n->parent == NULL) {
@ -1285,12 +1285,12 @@ size_t rrip_calc_len(Ecma119Image *t, Ecma119Node *n, int type, size_t used_up,
*/ */
su_size += 7 + 28; /* SP + CE */ su_size += 7 + 28; /* SP + CE */
/* ER of RRIP */ /* ER of RRIP */
if (t->rrip_version_1_10) { if (t->opts->rrip_version_1_10) {
*ce = 237; *ce = 237;
} else { } else {
*ce = 182; *ce = 182;
} }
if (t->aaip && !t->aaip_susp_1_10) { if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
*ce += 160; /* ER of AAIP */ *ce += 160; /* ER of AAIP */
} }
/* Compute length of AAIP string of root node */ /* Compute length of AAIP string of root node */
@ -1394,7 +1394,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
} }
/* If AAIP enabled and announced by ER : Announce RRIP by ES */ /* If AAIP enabled and announced by ER : Announce RRIP by ES */
if (t->aaip && !t->aaip_susp_1_10) { if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
ret = susp_add_ES(t, info, 0, 0); ret = susp_add_ES(t, info, 0, 0);
if (ret < 0) if (ret < 0)
goto add_susp_cleanup; goto add_susp_cleanup;
@ -1437,7 +1437,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
} }
} }
} else if(ecma119_is_dedicated_reloc_dir(t, n) && } else if(ecma119_is_dedicated_reloc_dir(t, n) &&
(t->rr_reloc_flags & 1)) { (t->opts->rr_reloc_flags & 1)) {
/* The dedicated relocation directory shall be marked by RE */ /* The dedicated relocation directory shall be marked by RE */
ret = rrip_add_RE(t, node, info); ret = rrip_add_RE(t, node, info);
if (ret < 0) if (ret < 0)
@ -1740,7 +1740,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
/* "." or ".." entry */ /* "." or ".." entry */
/* write the NM entry */ /* write the NM entry */
if (t->rrip_version_1_10) { if (t->opts->rrip_version_1_10) {
/* RRIP-1.10: /* RRIP-1.10:
"NM" System Use Fields recorded for the ISO 9660 directory "NM" System Use Fields recorded for the ISO 9660 directory
records with names (00) and (01), used to designate the records with names (00) and (01), used to designate the
@ -1780,12 +1780,12 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
* Note that SP entry was already added above * Note that SP entry was already added above
*/ */
if (t->rrip_version_1_10) { if (t->opts->rrip_version_1_10) {
rrip_er_len = 237; rrip_er_len = 237;
} else { } else {
rrip_er_len = 182; rrip_er_len = 182;
} }
if (t->aaip && !t->aaip_susp_1_10) { if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
aaip_er_len = 160; aaip_er_len = 160;
} }
@ -1804,7 +1804,7 @@ int rrip_get_susp_fields(Ecma119Image *t, Ecma119Node *n, int type,
if (ret < 0) { if (ret < 0) {
goto add_susp_cleanup; goto add_susp_cleanup;
} }
if (t->aaip && !t->aaip_susp_1_10) { if (t->opts->aaip && !t->opts->aaip_susp_1_10) {
ret = aaip_add_ER(t, info, 0); ret = aaip_add_ER(t, info, 0);
if (ret < 0) { if (ret < 0) {
goto add_susp_cleanup; goto add_susp_cleanup;

View File

@ -138,13 +138,14 @@ int iso_compute_append_partitions(Ecma119Image *t, int flag)
else else
cyl_size /= 4; cyl_size /= 4;
} }
pos = (t->vol_space_size + t->ms_block); pos = (t->vol_space_size + t->opts->ms_block);
for (i = 0; i < ISO_MAX_PARTITIONS; i++) { for (i = 0; i < ISO_MAX_PARTITIONS; i++) {
if (t->appended_partitions[i] == NULL) if (t->opts->appended_partitions[i] == NULL)
continue; continue;
if (t->appended_partitions[i][0] == 0) if (t->opts->appended_partitions[i][0] == 0)
continue; continue;
ret = compute_partition_size(t->appended_partitions[i], &size, 0); ret = compute_partition_size(t->opts->appended_partitions[i], &size,
0);
if (ret < 0) if (ret < 0)
return ret; return ret;
add_pos = 0; add_pos = 0;
@ -706,8 +707,8 @@ static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
memset(buf, 0, 512); memset(buf, 0, 512);
/* 0 - 127 | label | ASCII Label */ /* 0 - 127 | label | ASCII Label */
if (t->ascii_disc_label[0]) if (t->opts->ascii_disc_label[0])
strncpy((char *) buf, t->ascii_disc_label, 128); strncpy((char *) buf, t->opts->ascii_disc_label, 128);
else else
strcpy((char *) buf, strcpy((char *) buf,
"CD-ROM Disc with Sun sparc boot created by libisofs"); "CD-ROM Disc with Sun sparc boot created by libisofs");
@ -755,7 +756,7 @@ static int make_sun_disk_label(Ecma119Image *t, uint8_t *buf, int flag)
/* Set partition 1 to describe ISO image and compute checksum */ /* Set partition 1 to describe ISO image and compute checksum */
t->appended_part_start[0] = 0; t->appended_part_start[0] = 0;
t->appended_part_size[0] = t->curblock; t->appended_part_size[0] = t->curblock;
ret = write_sun_partition_entry(1, t->appended_partitions, ret = write_sun_partition_entry(1, t->opts->appended_partitions,
t->appended_part_start, t->appended_part_size, t->appended_part_start, t->appended_part_size,
ISO_SUN_CYL_SIZE, buf, 0); ISO_SUN_CYL_SIZE, buf, 0);
if (ret < 0) if (ret < 0)
@ -957,7 +958,7 @@ static int fill_apm_gaps(Ecma119Image *t, uint32_t img_blocks)
char gap_name[33]; char gap_name[33];
if (t->apm_req_flags & 4) if (t->apm_req_flags & 4)
block_fac = 2048 / t->apm_block_size; block_fac = 2048 / t->opts->apm_block_size;
/* Find out whether an entry with start_block <= 1 is requested */ /* Find out whether an entry with start_block <= 1 is requested */
for (i = 0; i < t->apm_req_count; i++) { for (i = 0; i < t->apm_req_count; i++) {
@ -1047,7 +1048,7 @@ static int rectify_apm(Ecma119Image *t)
return 1; return 1;
if (t->gpt_req_count > 0 && if (t->gpt_req_count > 0 &&
t->apm_block_size != 2048 && t->apm_req_count > 0) { t->opts->apm_block_size != 2048 && t->apm_req_count > 0) {
iso_msgs_submit(0, iso_msgs_submit(0,
"GPT and APM requested. APM block size would have to be 2048.", "GPT and APM requested. APM block size would have to be 2048.",
0, "FAILURE", 0); 0, "FAILURE", 0);
@ -1077,7 +1078,7 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
}; };
if (t->apm_req_flags & 4) if (t->apm_req_flags & 4)
block_fac = 2048 / t->apm_block_size; block_fac = 2048 / t->opts->apm_block_size;
if (t->apm_req_count <= 0) if (t->apm_req_count <= 0)
return 2; return 2;
@ -1097,7 +1098,7 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
} }
/* If block size is larger than 512, then not all 63 entries will fit */ /* If block size is larger than 512, then not all 63 entries will fit */
if ((t->apm_req_count + 1) * t->apm_block_size > 32768) if ((t->apm_req_count + 1) * t->opts->apm_block_size > 32768)
return ISO_BOOT_TOO_MANY_APM; return ISO_BOOT_TOO_MANY_APM;
/* Block 1 describes the APM itself */ /* Block 1 describes the APM itself */
@ -1109,15 +1110,15 @@ static int iso_write_apm(Ecma119Image *t, uint32_t img_blocks, uint8_t *buf,
possible MBR. possible MBR.
*/ */
memcpy(buf, block0_template, 8); memcpy(buf, block0_template, 8);
buf[2]= (t->apm_block_size >> 8) & 0xff; buf[2]= (t->opts->apm_block_size >> 8) & 0xff;
buf[3]= 0; buf[3]= 0;
} }
/* Write APM Block 1 to t->apm_req_count */ /* Write APM Block 1 to t->apm_req_count */
for (i = 0; i < t->apm_req_count; i++) { for (i = 0; i < t->apm_req_count; i++) {
ret = iso_write_apm_entry(t, t->apm_block_size, t->apm_req[i], ret = iso_write_apm_entry(t, t->opts->apm_block_size, t->apm_req[i],
buf + (i + 1) * t->apm_block_size, t->apm_req_count, buf + (i + 1) * t->opts->apm_block_size, t->apm_req_count,
i == 0); i == 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
@ -1453,7 +1454,7 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
last_partition = 8; last_partition = 8;
} }
for (i = first_partition - 1; i <= last_partition - 1; i++) for (i = first_partition - 1; i <= last_partition - 1; i++)
if (t->appended_partitions[i] != NULL) { if (t->opts->appended_partitions[i] != NULL) {
will_append = 1; will_append = 1;
break; break;
} }
@ -1577,14 +1578,14 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
ret = make_sun_disk_label(t, buf, 0); ret = make_sun_disk_label(t, buf, 0);
if (ret != ISO_SUCCESS) if (ret != ISO_SUCCESS)
return ret; return ret;
} else if ((t->partition_offset > 0 || will_append) && sa_type == 0 && } else if ((t->opts->partition_offset > 0 || will_append) &&
t->mbr_req_count == 0) { sa_type == 0 && t->mbr_req_count == 0) {
/* Write a simple partition table. */ /* Write a simple partition table. */
ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head, ret = make_grub_msdos_label(img_blocks, t->partition_secs_per_head,
t->partition_heads_per_cyl, buf, 2); t->partition_heads_per_cyl, buf, 2);
if (ret != ISO_SUCCESS) /* error should never happen */ if (ret != ISO_SUCCESS) /* error should never happen */
return ISO_ASSERT_FAILURE; return ISO_ASSERT_FAILURE;
if (t->partition_offset == 0) { if (t->opts->partition_offset == 0) {
/* Re-write partion entry 1 : start at 0, type Linux */ /* Re-write partion entry 1 : start at 0, type Linux */
ret = write_mbr_partition_entry(1, 0x83, ret = write_mbr_partition_entry(1, 0x83,
(uint64_t) 0, (uint64_t) img_blocks, (uint64_t) 0, (uint64_t) img_blocks,
@ -1595,12 +1596,13 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
} }
} }
if (t->partition_offset > 0 && sa_type == 0 && t->mbr_req_count == 0) { if (t->opts->partition_offset > 0 && sa_type == 0 &&
t->mbr_req_count == 0) {
/* Adjust partition table to partition offset. /* Adjust partition table to partition offset.
With t->mbr_req_count > 0 this has already been done, With t->mbr_req_count > 0 this has already been done,
*/ */
img_blocks = t->curblock; /* value might be altered */ img_blocks = t->curblock; /* value might be altered */
ret = iso_offset_partition_start(img_blocks, t->partition_offset, ret = iso_offset_partition_start(img_blocks, t->opts->partition_offset,
t->partition_secs_per_head, t->partition_secs_per_head,
t->partition_heads_per_cyl, buf, 0); t->partition_heads_per_cyl, buf, 0);
if (ret != ISO_SUCCESS) /* error should never happen */ if (ret != ISO_SUCCESS) /* error should never happen */
@ -1611,17 +1613,19 @@ int iso_write_system_area(Ecma119Image *t, uint8_t *buf)
made so far. Overwriting those from t->mbr_req is not allowed. made so far. Overwriting those from t->mbr_req is not allowed.
*/ */
for (i = first_partition - 1; i <= last_partition - 1; i++) { for (i = first_partition - 1; i <= last_partition - 1; i++) {
if (t->appended_partitions[i] == NULL) if (t->opts->appended_partitions[i] == NULL)
continue; continue;
if (i < t->mbr_req_count) if (i < t->mbr_req_count)
return ISO_BOOT_MBR_COLLISION; return ISO_BOOT_MBR_COLLISION;
if (sa_type == 3) { if (sa_type == 3) {
ret = write_sun_partition_entry(i + 1, t->appended_partitions, ret = write_sun_partition_entry(i + 1,
t->opts->appended_partitions,
t->appended_part_start, t->appended_part_size, t->appended_part_start, t->appended_part_size,
ISO_SUN_CYL_SIZE, ISO_SUN_CYL_SIZE,
buf, t->appended_partitions[i][0] == 0); buf, t->opts->appended_partitions[i][0] == 0);
} else { } else {
ret = write_mbr_partition_entry(i + 1, t->appended_part_types[i], ret = write_mbr_partition_entry(i + 1,
t->opts->appended_part_types[i],
(uint64_t) t->appended_part_start[i], (uint64_t) t->appended_part_start[i],
(uint64_t) t->appended_part_size[i], (uint64_t) t->appended_part_size[i],
t->partition_secs_per_head, t->partition_heads_per_cyl, t->partition_secs_per_head, t->partition_heads_per_cyl,
@ -1690,7 +1694,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
if (ret < 0) if (ret < 0)
goto ex; goto ex;
img_blocks = t->curblock + t->tail_blocks + t->gpt_backup_size; img_blocks = t->curblock + t->opts->tail_blocks + t->gpt_backup_size;
imgsize = ((off_t) img_blocks) * (off_t) 2048; imgsize = ((off_t) img_blocks) * (off_t) 2048;
if (((t->system_area_options & 3) || always_align) if (((t->system_area_options & 3) || always_align)
&& (off_t) (t->partition_heads_per_cyl * t->partition_secs_per_head && (off_t) (t->partition_heads_per_cyl * t->partition_secs_per_head
@ -1766,7 +1770,7 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
(int) cylsize); (int) cylsize);
iso_msgs_submit(0, msg, 0, "WARNING", 0); iso_msgs_submit(0, msg, 0, "WARNING", 0);
} else { } else {
t->tail_blocks += frac / 2048; t->opts->tail_blocks += frac / 2048;
} }
ret = ISO_SUCCESS; ret = ISO_SUCCESS;
ex:; ex:;
@ -2059,7 +2063,8 @@ static int precompute_gpt(Ecma119Image *t)
/* Determine GPT partition start in System Area, */ /* Determine GPT partition start in System Area, */
gpt_part_start = 0; gpt_part_start = 0;
if (t->apm_req_count > 0) if (t->apm_req_count > 0)
gpt_part_start = (t->apm_req_count + 1) * (t->apm_block_size / 512); gpt_part_start = (t->apm_req_count + 1) *
(t->opts->apm_block_size / 512);
if (gpt_part_start < 2) if (gpt_part_start < 2)
gpt_part_start = 2; gpt_part_start = 2;
else if (gpt_part_start >= 64) else if (gpt_part_start >= 64)
@ -2222,11 +2227,12 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
t = writer->target; t = writer->target;
with_chrp = ((t->system_area_options & 0x3cff) == 0x0400); with_chrp = ((t->system_area_options & 0x3cff) == 0x0400);
if (t->efi_boot_partition != NULL || (t->hfsplus && !with_chrp) || if (t->opts->efi_boot_partition != NULL ||
(t->opts->hfsplus && !with_chrp) ||
t->gpt_req_count > 0) t->gpt_req_count > 0)
will_have_gpt = 1; will_have_gpt = 1;
if (t->efi_boot_partition != NULL) { if (t->opts->efi_boot_partition != NULL) {
if (t->efi_boot_part_filesrc != NULL) { if (t->efi_boot_part_filesrc != NULL) {
/* A file in the emerging ISO image shall store its content /* A file in the emerging ISO image shall store its content
as prepended partition. as prepended partition.
@ -2239,7 +2245,7 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
t->efi_boot_part_size += (src->sections[i].size + 2047) / 2048; t->efi_boot_part_size += (src->sections[i].size + 2047) / 2048;
} }
} else { } else {
ret = compute_partition_size(t->efi_boot_partition, ret = compute_partition_size(t->opts->efi_boot_partition,
&(t->efi_boot_part_size), 0); &(t->efi_boot_part_size), 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -2256,7 +2262,7 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
if (with_chrp) { if (with_chrp) {
/* CHRP is not compatible with any other partition in MBR */ /* CHRP is not compatible with any other partition in MBR */
if (t->prep_partition != NULL || t->fat || will_have_gpt || if (t->opts->prep_partition != NULL || t->opts->fat || will_have_gpt ||
t->mbr_req_count > 0) t->mbr_req_count > 0)
return ISO_BOOT_MBR_OVERLAP; return ISO_BOOT_MBR_OVERLAP;
ret = iso_quick_mbr_entry(t, (uint64_t) 0, (uint64_t) 0, ret = iso_quick_mbr_entry(t, (uint64_t) 0, (uint64_t) 0,
@ -2266,16 +2272,16 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
return ISO_SUCCESS; return ISO_SUCCESS;
} }
if (t->prep_partition != NULL) { if (t->opts->prep_partition != NULL) {
ret = compute_partition_size(t->prep_partition, &(t->prep_part_size), ret = compute_partition_size(t->opts->prep_partition,
0); &(t->prep_part_size), 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
if (t->prep_part_size > 0 || t->fat || will_have_gpt) { if (t->prep_part_size > 0 || t->opts->fat || will_have_gpt) {
/* Protecting MBR entry for ISO start or whole ISO */ /* Protecting MBR entry for ISO start or whole ISO */
ret = iso_quick_mbr_entry(t, will_have_gpt ? (uint64_t) 1 : ret = iso_quick_mbr_entry(t, will_have_gpt ? (uint64_t) 1 :
((uint64_t) t->partition_offset) * 4, ((uint64_t) t->opts->partition_offset) * 4,
(uint64_t) 0, (uint64_t) 0,
will_have_gpt ? 0xee : 0xcd, 0, 0); will_have_gpt ? 0xee : 0xcd, 0, 0);
if (ret < 0) if (ret < 0)
@ -2289,11 +2295,11 @@ static int partprepend_writer_compute_data_blocks(IsoImageWriter *writer)
return ret; return ret;
t->curblock += t->prep_part_size; t->curblock += t->prep_part_size;
} }
if (t->prep_part_size > 0 || t->fat) { if (t->prep_part_size > 0 || t->opts->fat) {
/* FAT partition or protecting MBR entry for ISO end */ /* FAT partition or protecting MBR entry for ISO end */
ret = iso_quick_mbr_entry(t, ((uint64_t) t->curblock) * 4, ret = iso_quick_mbr_entry(t, ((uint64_t) t->curblock) * 4,
(uint64_t) 0, (uint64_t) 0,
t->fat ? 0x0c : 0xcd, 0, 0); t->opts->fat ? 0x0c : 0xcd, 0, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
@ -2315,21 +2321,21 @@ static int partprepend_writer_write_data(IsoImageWriter *writer)
t = writer->target; t = writer->target;
if (t->efi_boot_partition != NULL && t->efi_boot_part_size) { if (t->opts->efi_boot_partition != NULL && t->efi_boot_part_size) {
if (t->efi_boot_part_filesrc != NULL) { if (t->efi_boot_part_filesrc != NULL) {
ret = iso_filesrc_write_data(t, t->efi_boot_part_filesrc, ret = iso_filesrc_write_data(t, t->efi_boot_part_filesrc,
NULL, NULL, 0); NULL, NULL, 0);
} else { } else {
ret = iso_write_partition_file(t, t->efi_boot_partition, ret = iso_write_partition_file(t, t->opts->efi_boot_partition,
(uint32_t) 0, t->efi_boot_part_size, 0); (uint32_t) 0, t->efi_boot_part_size, 0);
} }
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
if (t->prep_partition != NULL && t->prep_part_size) { if (t->opts->prep_partition != NULL && t->prep_part_size) {
ret = iso_write_partition_file(t, t->prep_partition, (uint32_t) 0, ret = iso_write_partition_file(t, t->opts->prep_partition,
t->prep_part_size, 0); (uint32_t) 0, t->prep_part_size, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }

View File

@ -2246,3 +2246,20 @@ void iso_smash_chars_for_joliet(uint16_t *name)
set_ucsbe(name + i, '_'); set_ucsbe(name + i, '_');
} }
int iso_clone_mem(char *in, char **out, size_t size)
{
if (in == NULL) {
*out = NULL;
return 1;
}
if (size == 0)
size = strlen(in) + 1;
*out = calloc(1, size);
if (*out == NULL)
return ISO_OUT_OF_MEM;
memcpy(*out, in, size);
return 1;
}

View File

@ -611,6 +611,15 @@ void *iso_alloc_mem(size_t size, size_t count, int flag);
} }
/*
@param in Valid memory or NULL
@param out Returns valid memory or NULL
@param size Number of bytes to copy. 0 means strlen(in)+1 if not NULL.
@return 1 or ISO_OUT_OF_MEM
*/
int iso_clone_mem(char *in, char **out, size_t size);
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */