|
|
1.1 ! root 1: /* ! 2: * ! 3: * (c) 2005-2009 Laurent Vivier <[email protected]> ! 4: * ! 5: * This file has been copied from EMILE, http://emile.sf.net ! 6: * ! 7: */ ! 8: ! 9: #include "libiso9660.h" ! 10: #include "libopenbios/bindings.h" ! 11: #include "libc/diskio.h" ! 12: ! 13: size_t iso9660_read(iso9660_FILE *_file, char *buf, size_t count) ! 14: { ! 15: iso9660_FILE *file = (iso9660_FILE*)_file; ! 16: size_t read = 0; ! 17: ! 18: if ( count > (file->size - file->offset) ) ! 19: count = file->size - file->offset; ! 20: ! 21: while (count > 0) ! 22: { ! 23: size_t part; ! 24: int offset_extent; ! 25: int offset_index; ! 26: ! 27: offset_extent = file->base + ! 28: (file->offset / ISOFS_BLOCK_SIZE); ! 29: offset_index = file->offset % ISOFS_BLOCK_SIZE; ! 30: ! 31: if (file->current != offset_extent) ! 32: { ! 33: if ( (offset_index == 0) && ! 34: (count >= ISOFS_BLOCK_SIZE) ) ! 35: { ! 36: /* direct i/o */ ! 37: ! 38: int extents_nb; ! 39: ! 40: extents_nb = count / ISOFS_BLOCK_SIZE; ! 41: ! 42: part = extents_nb * ISOFS_BLOCK_SIZE; ! 43: ! 44: seek_io(file->volume->fd, ! 45: offset_extent * ISOFS_BLOCK_SIZE); ! 46: read_io(file->volume->fd, buf + read, part); ! 47: ! 48: file->offset += part; ! 49: count -= part; ! 50: read += part; ! 51: ! 52: continue; ! 53: } ! 54: ! 55: file->current = offset_extent; ! 56: seek_io(file->volume->fd, ! 57: offset_extent * ISOFS_BLOCK_SIZE); ! 58: read_io(file->volume->fd, file->buffer, ! 59: ISOFS_BLOCK_SIZE); ! 60: } ! 61: ! 62: part = ISOFS_BLOCK_SIZE - offset_index; ! 63: if (count < part) ! 64: part = count; ! 65: ! 66: memcpy(buf + read, file->buffer + offset_index, part); ! 67: ! 68: file->offset += part; ! 69: count -= part; ! 70: read += part; ! 71: } ! 72: ! 73: return read; ! 74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.