static imgtoolerr_t ascii_readfile(imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf) { imgtoolerr_t err; imgtool_stream *mem_stream; mem_stream = stream_open_mem(NULL, 0); if (!mem_stream) { err = IMGTOOLERR_OUTOFMEMORY; goto done; } err = imgtool_partition_read_file(partition, filename, fork, mem_stream, NULL); if (err) goto done; stream_seek(mem_stream, SEEK_SET, 0); err = convert_stream_eolns(mem_stream, destf, EOLN); if (err) goto done; done: if (mem_stream) stream_close(mem_stream); return err; }
static void node_checkfile(struct imgtooltest_state *state, xml_data_node *node) { imgtoolerr_t err; const char *filename; const char *fork; filter_getinfoproc filter; imgtool_stream *stream = NULL; UINT64 stream_sz; const void *stream_ptr; mess_pile pile; if (!state->m_partition) { state->m_failed = 1; report_message(MSG_FAILURE, "Partition not loaded"); goto done; } get_file_params(node, &filename, &fork, &filter); if (!filename) goto done; stream = stream_open_mem(NULL, 0); if (!stream) { state->m_failed = 1; error_outofmemory(); goto done; } err = imgtool_partition_read_file(state->m_partition, filename, fork, stream, filter); if (err) { state->m_failed = 1; report_imgtoolerr(err); goto done; } pile_init(&pile); messtest_get_data(node, &pile); stream_ptr = stream_getptr(stream); stream_sz = stream_size(stream); if ((pile_size(&pile) != stream_sz) || (memcmp(stream_ptr, pile_getptr(&pile), pile_size(&pile)))) { report_message(MSG_FAILURE, "Failed file verification"); goto done; } pile_delete(&pile); done: if (stream != NULL) stream_close(stream); }
static imgtoolerr_t macbinary_readfile(imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf) { static const UINT32 attrs[] = { IMGTOOLATTR_TIME_CREATED, IMGTOOLATTR_TIME_LASTMODIFIED, IMGTOOLATTR_INT_MAC_TYPE, IMGTOOLATTR_INT_MAC_CREATOR, IMGTOOLATTR_INT_MAC_FINDERFLAGS, IMGTOOLATTR_INT_MAC_COORDX, IMGTOOLATTR_INT_MAC_COORDY, IMGTOOLATTR_INT_MAC_FINDERFOLDER, IMGTOOLATTR_INT_MAC_SCRIPTCODE, IMGTOOLATTR_INT_MAC_EXTENDEDFLAGS, 0 }; imgtoolerr_t err; UINT8 header[128]; const char *basename; int i; UINT32 type_code = 0x3F3F3F3F; UINT32 creator_code = 0x3F3F3F3F; UINT16 finder_flags = 0; UINT16 coord_x = 0; UINT16 coord_y = 0; UINT16 finder_folder = 0; UINT8 script_code = 0; UINT8 extended_flags = 0; imgtool_forkent fork_entries[4]; const imgtool_forkent *data_fork = NULL; const imgtool_forkent *resource_fork = NULL; UINT32 creation_time = 0; UINT32 lastmodified_time = 0; imgtool_attribute attr_values[10]; /* get the forks */ err = imgtool_partition_list_file_forks(partition, filename, fork_entries, sizeof(fork_entries)); if (err) return err; for (i = 0; fork_entries[i].type != FORK_END; i++) { if (fork_entries[i].type == FORK_DATA) data_fork = &fork_entries[i]; else if (fork_entries[i].type == FORK_RESOURCE) resource_fork = &fork_entries[i]; } /* get the attributes */ err = imgtool_partition_get_file_attributes(partition, filename, attrs, attr_values); if (err && (ERRORCODE(err) != IMGTOOLERR_UNIMPLEMENTED)) return err; if (err == IMGTOOLERR_SUCCESS) { creation_time = mac_setup_time(attr_values[0].t); lastmodified_time = mac_setup_time(attr_values[1].t); type_code = attr_values[2].i; creator_code = attr_values[3].i; finder_flags = attr_values[4].i; coord_x = attr_values[5].i; coord_y = attr_values[6].i; finder_folder = attr_values[7].i; script_code = attr_values[8].i; extended_flags = attr_values[9].i; } memset(header, 0, sizeof(header)); /* place filename */ basename = filename; while(basename[strlen(basename) + 1]) basename += strlen(basename) + 1; pascal_from_c_string((unsigned char *) &header[1], 64, basename); place_integer_be(header, 65, 4, type_code); place_integer_be(header, 69, 4, creator_code); place_integer_be(header, 73, 1, (finder_flags >> 8) & 0xFF); place_integer_be(header, 75, 2, coord_x); place_integer_be(header, 77, 2, coord_y); place_integer_be(header, 79, 2, finder_folder); place_integer_be(header, 83, 4, data_fork ? data_fork->size : 0); place_integer_be(header, 87, 4, resource_fork ? resource_fork->size : 0); place_integer_be(header, 91, 4, creation_time); place_integer_be(header, 95, 4, lastmodified_time); place_integer_be(header, 101, 1, (finder_flags >> 0) & 0xFF); place_integer_be(header, 102, 4, 0x6D42494E); place_integer_be(header, 106, 1, script_code); place_integer_be(header, 107, 1, extended_flags); place_integer_be(header, 122, 1, 0x82); place_integer_be(header, 123, 1, 0x81); place_integer_be(header, 124, 2, ccitt_crc16(0, header, 124)); stream_write(destf, header, sizeof(header)); if (data_fork) { err = imgtool_partition_read_file(partition, filename, "", destf, NULL); if (err) return err; stream_fill(destf, 0, pad128(data_fork->size)); } if (resource_fork) { err = imgtool_partition_read_file(partition, filename, "RESOURCE_FORK", destf, NULL); if (err) return err; stream_fill(destf, 0, pad128(resource_fork->size)); } return IMGTOOLERR_SUCCESS; }