The read_file() function is called when the user requests a file to be read from the source image.
Declared in src/mess/tools/imgtool/library.h
as
imgtoolerr_t (*read_file)( imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf );
partition
– Pointer to an imgtool_partition where the file is.filename
– Pointer to a string with the filename of the file the user wants to read.fork
– Pointer to a string with a resource fork. Only used for Macintosh filesystems.destf
– Pointer to an imgtool_stream to write the file data to.
An imgtoolerr_t with the type of error that occurred or IMGTOOLERR_SUCCESS
if no error occurred.
imgtoolerr_t mymodule_read_file( imgtool_partition *partition, const char *filename, const char *fork, imgtool_stream *destf ) { imgtoolerr_t ret; imgtool_image *image = imgtool_partition_image(partition); int filesize, track, sector; UINT8 buffer[SECTOR_SIZE]; directory_entry entry; ret = mymodule_get_directory_entry(image, filename, &entry); if (ret) return ret; filesize = entry.end_address - entry.start_address; track = entry.start_track; sector = entry.start_sector; while (filesize > 0) { int bytes_left; ret = mymodule_read_sector_data(image, track, sector, buffer); if (ret) return ret; /* detect sectors pointing to themselfs */ if ((track == pick_integer_le(buffer, DATA_SIZE, 1)) && (sector == pick_integer_le(buffer, DATA_SIZE + 1, 1))) return IMGTOOLERR_CORRUPTIMAGE; /* load next track and sector values */ track = pick_integer_le(buffer, DATA_SIZE, 1); sector = pick_integer_le(buffer, DATA_SIZE + 1, 1); /* track 0 is invalid */ if ((track == 0) && (filesize > DATA_SIZE)) return IMGTOOLERR_CORRUPTIMAGE; /* write either DATA_SIZE or the remaining bytes */ bytes_left = filesize > DATA_SIZE ? DATA_SIZE : filesize; if (stream_write(destf, buffer, bytes_left) != bytes_left) return IMGTOOLERR_WRITEERROR; filesize -= DATA_SIZE; } return IMGTOOLERR_SUCCESS; }
This is a simple example that doesn't use partitions.