read_file()


The read_file() function is called when the user requests a file to be read from the source image.

Syntax


Declaration

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
);

Parameters

  • 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.

Returns

An imgtoolerr_t with the type of error that occurred or IMGTOOLERR_SUCCESS if no error occurred.

Example


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.