diff --git a/libiso9660/iso9660_read.c b/libiso9660/iso9660_read.c index 11ec7aa..c529dc6 100644 --- a/libiso9660/iso9660_read.c +++ b/libiso9660/iso9660_read.c @@ -19,7 +19,31 @@ ssize_t iso9660_read(iso9660_FILE *file, void *buf, size_t count) { size_t part; - if (file->index == 2048) + /* direct i/o */ + + if ( (file->index == sizeof (file->buffer)) && + (count > sizeof (file->buffer)) ) + { + int extents; + + if (file->len < count) + extents = file->len / sizeof(file->buffer); + else + extents = count / sizeof (file->buffer); + + part = extents * sizeof (file->buffer); + + __iso9660_device_read(file->extent, + buf + read, part); + file->len -= part; + file->extent += extents; + count -= part; + read += part; + + continue; + } + + if (file->index == sizeof (file->buffer)) { if (file->len <= 0) return read;