From 7e49fb553bf2b1ec9a009ca1afb5e16800a43f28 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 24 Jun 2012 16:00:03 +0200 Subject: [PATCH] Enabled the opportunity to set HFSPLUS_BLOCK_SIZE to 512 for experiments. --- libisofs/ecma119.c | 3 + libisofs/ecma119_tree.c | 3 + libisofs/hfsplus.c | 189 +++++++++++++++++++++++++++++++++++----- 3 files changed, 175 insertions(+), 20 deletions(-) diff --git a/libisofs/ecma119.c b/libisofs/ecma119.c index 3ed7514..628a49d 100644 --- a/libisofs/ecma119.c +++ b/libisofs/ecma119.c @@ -1518,6 +1518,9 @@ void *write_function(void *arg) 0, "FATAL", 0); } if (target->bytes_written != target->total_size) { + iso_msg_debug(target->image->id, + "bytes_written = %.f <-> total_size = %.f", + (double) target->bytes_written, (double) target->total_size); iso_msgs_submit(0, "Image is most likely damaged. Calculated/written image end address mismatch.", 0, "FATAL", 0); diff --git a/libisofs/ecma119_tree.c b/libisofs/ecma119_tree.c index 9812282..2133b39 100644 --- a/libisofs/ecma119_tree.c +++ b/libisofs/ecma119_tree.c @@ -734,8 +734,11 @@ int mangle_single_dir(Ecma119Image *img, Ecma119Node *dir, int max_file_len, ret = ISO_OUT_OF_MEM; goto mangle_cleanup; } + +#ifdef Libisofs_extra_verbose_debuG iso_msg_debug(img->image->id, "\"%s\" renamed to \"%s\"", children[k]->iso_name, new); +#endif iso_htable_remove_ptr(table, children[k]->iso_name, NULL); free(children[k]->iso_name); diff --git a/libisofs/hfsplus.c b/libisofs/hfsplus.c index 45553c2..fef2e84 100644 --- a/libisofs/hfsplus.c +++ b/libisofs/hfsplus.c @@ -10,6 +10,17 @@ * See COPYING file for details. */ + +/* Some extra debugging messages for Vladimir Serbinko + #define Libisofs_hfsplus_verbose_debuG yes +*/ + +/* Some extra debugging messages for Thomas Schmitt +*/ +#define Libisofs_ts_debuG yes + + + #ifdef HAVE_CONFIG_H #include "../config.h" #endif @@ -30,8 +41,10 @@ #include #include -#define HFSPLUS_BLOCK_SIZE BLOCK_SIZE -#define HFSPLUS_CAT_NODE_SIZE (2 * BLOCK_SIZE) +#define HFSPLUS_BLOCK_SIZE 2048 +#define HFSPLUS_CAT_NODE_SIZE (2 * HFSPLUS_BLOCK_SIZE) + +#define HFSPLUS_ISO_BLOCK_FAC (2048 / HFSPLUS_BLOCK_SIZE) #include /* For these prototypes: @@ -40,6 +53,26 @@ uint16_t htons(uint16_t hostshort); */ +/* ts B20623: pad up output block to full 2048 bytes */ +static +int pad_up_block(Ecma119Image *t) +{ + int ret; + static char buffer[2048], buf_zeroed = 0; + + if (!buf_zeroed) { + memset(buffer, 0, 2048); + buf_zeroed = 1; + } + if (t->bytes_written % 2048) { + ret = iso_write(t, buffer, 2048 - (t->bytes_written % 2048)); + if (ret < 0) + return ret; + } + return 1; +} + + static int filesrc_block_and_size(Ecma119Image *t, IsoFileSrc *src, uint32_t *start_block, uint64_t *total_size) @@ -275,8 +308,15 @@ int create_tree(Ecma119Image *t, IsoNode *iso, uint32_t parent_id) cat_id = t->hfsp_cat_id++; for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) - if (t->hfsplus_blessed[i] == iso) + if (t->hfsplus_blessed[i] == iso) { + +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus bless %d to cat_id %u ('%s')", + i, cat_id, iso->name); +#endif /* Libisofs_ts_debuG */ + t->hfsp_bless_id[i] = cat_id; + } set_hfsplus_name (t, iso->name, &t->hfsp_leafs[t->hfsp_curleaf]); t->hfsp_leafs[t->hfsp_curleaf].node = iso; @@ -382,14 +422,19 @@ int hfsplus_tail_writer_compute_data_blocks(IsoImageWriter *writer) { Ecma119Image *t; uint32_t hfsp_size; - + if (writer == NULL) { return ISO_OUT_OF_MEM; } t = writer->target; - hfsp_size = t->curblock - t->hfsp_part_start + 1; +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus tail writer start = %.f", + ((double) t->curblock) * 2048.0); +#endif + + hfsp_size = t->curblock * HFSPLUS_ISO_BLOCK_FAC - t->hfsp_part_start + 1; /* We need one bit for every block. */ /* So if we allocate x blocks we have to satisfy: @@ -398,13 +443,23 @@ int hfsplus_tail_writer_compute_data_blocks(IsoImageWriter *writer) */ t->hfsp_allocation_blocks = hfsp_size / (8 * HFSPLUS_BLOCK_SIZE - 1) + 1; - t->hfsp_allocation_file_start = t->curblock; - t->curblock += t->hfsp_allocation_blocks; + t->hfsp_allocation_file_start = t->curblock * HFSPLUS_ISO_BLOCK_FAC; + t->curblock += t->hfsp_allocation_blocks / HFSPLUS_ISO_BLOCK_FAC; + if (t->hfsp_allocation_blocks % HFSPLUS_ISO_BLOCK_FAC) + t->curblock++; t->curblock++; - t->hfsp_total_blocks = t->curblock - t->hfsp_part_start; - t->apm_block_size = 0x800; - return iso_quick_apm_entry(t, t->hfsp_part_start, t->hfsp_total_blocks, +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus tail writer end = %.f", + ((double) t->curblock) * 2048.0); +#endif + + t->hfsp_total_blocks = t->curblock * HFSPLUS_ISO_BLOCK_FAC + - t->hfsp_part_start; + t->apm_block_size = HFSPLUS_BLOCK_SIZE; + return iso_quick_apm_entry(t, t->hfsp_part_start / HFSPLUS_ISO_BLOCK_FAC, + t->hfsp_total_blocks / HFSPLUS_ISO_BLOCK_FAC + + !!(t->hfsp_total_blocks % HFSPLUS_ISO_BLOCK_FAC), "HFSPLUS_Hybrid", "Apple_HFS"); } @@ -412,7 +467,7 @@ static int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer) { Ecma119Image *t; - uint32_t i; + uint32_t i, link_blocks; if (writer == NULL) { return ISO_OUT_OF_MEM; @@ -421,23 +476,43 @@ int hfsplus_writer_compute_data_blocks(IsoImageWriter *writer) t = writer->target; iso_msg_debug(t->image->id, "(b) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes); - t->hfsp_part_start = t->curblock; + t->hfsp_part_start = t->curblock * HFSPLUS_ISO_BLOCK_FAC; + t->curblock++; - t->hfsp_catalog_file_start = t->curblock; - t->curblock += 2 * t->hfsp_nnodes; + t->hfsp_catalog_file_start = t->curblock * HFSPLUS_ISO_BLOCK_FAC; - t->hfsp_extent_file_start = t->curblock; +/* ts B20623 was: + t->curblock += 2 * t->hfsp_nnodes; +*/ + t->curblock += (t->hfsp_nnodes * HFSPLUS_CAT_NODE_SIZE + 2047) / 2048; + + t->hfsp_extent_file_start = t->curblock * HFSPLUS_ISO_BLOCK_FAC; t->curblock++; iso_msg_debug(t->image->id, "(d) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes); + + link_blocks = 0; for (i = 0; i < t->hfsp_nleafs; i++) if (t->hfsp_leafs[i].unix_type == UNIX_SYMLINK) { + + /* ts B20623 : was: t->hfsp_leafs[i].symlink_block = t->curblock; t->curblock += (t->hfsp_leafs[i].symlink_size + HFSPLUS_BLOCK_SIZE - 1) / HFSPLUS_BLOCK_SIZE; + */ + + t->hfsp_leafs[i].symlink_block = + t->curblock * HFSPLUS_ISO_BLOCK_FAC + link_blocks; + link_blocks += (t->hfsp_leafs[i].symlink_size + + HFSPLUS_BLOCK_SIZE - 1) / HFSPLUS_BLOCK_SIZE; } + /* ts B20623 */ + t->curblock += link_blocks / HFSPLUS_ISO_BLOCK_FAC; + if (link_blocks % HFSPLUS_ISO_BLOCK_FAC) + t->curblock++; + iso_msg_debug(t->image->id, "(a) curblock=%d, nodes =%d", t->curblock, t->hfsp_nnodes); return ISO_SUCCESS; @@ -517,7 +592,7 @@ write_sb (Ecma119Image *t) set_time (&sb.fsck_time, t->now); iso_msb ((uint8_t *) &sb.file_count, t->hfsp_nfiles, 4); iso_msb ((uint8_t *) &sb.folder_count, t->hfsp_ndirs - 1, 4); - iso_msb ((uint8_t *) &sb.blksize, 0x800, 4); + iso_msb ((uint8_t *) &sb.blksize, HFSPLUS_BLOCK_SIZE, 4); iso_msb ((uint8_t *) &sb.catalog_node_id, t->hfsp_cat_id, 4); iso_msb ((uint8_t *) &sb.rsrc_clumpsize, HFSPLUS_BLOCK_SIZE, 4); iso_msb ((uint8_t *) &sb.data_clumpsize, HFSPLUS_BLOCK_SIZE, 4); @@ -544,13 +619,19 @@ write_sb (Ecma119Image *t) iso_msb ((uint8_t *) &sb.catalog_file.extents[0].count, 2 * t->hfsp_nnodes, 4); iso_msg_debug(t->image->id, "catalog_file_start = %d\n", (int)t->hfsp_catalog_file_start); - for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) + for (i = 0; i < ISO_HFSPLUS_BLESS_MAX; i++) { iso_msb ((uint8_t *) (&sb.ppc_bootdir + i + (i == ISO_HFSPLUS_BLESS_OSX_FOLDER)), t->hfsp_bless_id[i], 4); - memcpy (&sb.num_serial, &t->hfsp_serial_number, 8); +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus bless %d written for cat_id %u", + i, t->hfsp_bless_id[i]); +#endif /* Libisofs_ts_debuG */ + } + + memcpy (&sb.num_serial, &t->hfsp_serial_number, 8); ret = iso_write(t, &sb, sizeof (sb)); if (ret < 0) return ret; @@ -610,7 +691,10 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) buffer[HFSPLUS_CAT_NODE_SIZE - 7] = (char) ((HFSPLUS_CAT_NODE_SIZE - 8) & 0xff); buffer[HFSPLUS_CAT_NODE_SIZE - 8] = (HFSPLUS_CAT_NODE_SIZE - 8) >> 8; +#ifdef Libisofs_hfsplus_verbose_debuG iso_msg_debug(t->image->id, "Write\n"); +#endif + ret = iso_write(t, buffer, HFSPLUS_CAT_NODE_SIZE); if (ret < 0) return ret; @@ -649,7 +733,10 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) curnode++; } iso_msb ((uint8_t *) buffer + HFSPLUS_CAT_NODE_SIZE - j * 2 - 2, curoff, 2); + +#ifdef Libisofs_hfsplus_verbose_debuG iso_msg_debug(t->image->id, "Write\n"); +#endif ret = iso_write(t, buffer, HFSPLUS_CAT_NODE_SIZE); @@ -680,6 +767,9 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) for (j = 0; j < t->hfsp_levels[level].nodes[i].cnt; j++) { iso_msb ((uint8_t *) buffer + HFSPLUS_CAT_NODE_SIZE - j * 2 - 2, curoff, 2); + +#ifdef Libisofs_hfsplus_verbose_debuG + if (t->hfsp_leafs[curnode].node->name == NULL) { iso_msg_debug(t->image->id, "%d out of %d", @@ -692,6 +782,8 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) t->hfsp_leafs[curnode].node->name); } +#endif /* Libisofs_hfsplus_verbose_debuG */ + switch (t->hfsp_leafs[curnode].type) { case HFSPLUS_FILE_THREAD: @@ -763,6 +855,24 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) 4); memcpy (common->file_creator, xinfo->creator_code, 4); + +#ifdef Libisofs_ts_debuG +{ +char crtp[14]; + +crtp[0] = '\''; +memcpy(crtp+1, xinfo->creator_code, 4); +strcpy(crtp + 5, "','"); +memcpy(crtp + 8, xinfo->type_code, 4); +crtp[12] = '\''; +crtp[13]= 0; +iso_msg_debug(t->image->id, + "hfsplus creator,type %s to '%s/%s'", + crtp, ((IsoNode *) t->hfsp_leafs[curnode].node->parent)->name, + t->hfsp_leafs[curnode].node->name); +} +#endif /* Libisofs_ts_debuG */ + } else if (ret < 0) return ret; @@ -810,6 +920,7 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) &blk, &sz); if (ret <= 0) return ret; + blk *= HFSPLUS_ISO_BLOCK_FAC; } if (sz == 0) blk = t->hfsp_part_start; @@ -829,17 +940,25 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) curnode++; } iso_msb ((uint8_t *) buffer + HFSPLUS_CAT_NODE_SIZE - j * 2 - 2, curoff, 2); + +#ifdef Libisofs_hfsplus_verbose_debuG iso_msg_debug(t->image->id, "Write\n"); +#endif + ret = iso_write(t, buffer, HFSPLUS_CAT_NODE_SIZE); if (ret < 0) return ret; } curpos = next_lev; } + memset (buffer, 0, sizeof (buffer)); + + ret = pad_up_block(t); + if (ret < 0) + return ret; iso_msg_debug(t->image->id, "real extent_file_start = %d\n", (int)t->bytes_written / 2048); - memset (buffer, 0, sizeof (buffer)); node_head = (struct hfsplus_btnode *) buffer; node_head->type = 1; iso_msb ((uint8_t *) &node_head->count, 3, 2); @@ -862,6 +981,10 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) if (ret < 0) return ret; + ret = pad_up_block(t); + if (ret < 0) + return ret; + iso_msg_debug(t->image->id, "(d) %d written", (int) t->bytes_written / 0x800); memset (buffer, 0, sizeof (buffer)); for (i = 0; i < t->hfsp_nleafs; i++) @@ -880,6 +1003,10 @@ int hfsplus_writer_write_data(IsoImageWriter *writer) return ret; } + ret = pad_up_block(t); + if (ret < 0) + return ret; + iso_msg_debug(t->image->id, "(a) %d written", (int) t->bytes_written / 0x800); return ISO_SUCCESS; } @@ -899,6 +1026,11 @@ int hfsplus_tail_writer_write_data(IsoImageWriter *writer) t = writer->target; +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus tail writer writes at = %.f", + (double) t->bytes_written); +#endif + memset (buffer, -1, sizeof (buffer)); complete_blocks = (t->hfsp_allocation_size - 1) / HFSPLUS_BLOCK_SIZE; remaining_blocks = t->hfsp_allocation_blocks - complete_blocks; @@ -928,9 +1060,26 @@ int hfsplus_tail_writer_write_data(IsoImageWriter *writer) return ret; } + ret = pad_up_block(t); + if (ret < 0) + return ret; + iso_msg_debug(t->image->id, "%d written", (int) t->bytes_written); - return write_sb (t); +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus tail writer writes sb at = %.f", + (double) t->bytes_written); +#endif + + ret = write_sb (t); + +#ifdef Libisofs_ts_debuG +iso_msg_debug(t->image->id, "hfsplus tail writer ends at = %.f", + (double) t->bytes_written); +#endif + + return ret; + } static