Annotation of qemu/roms/openbios/fs/iso9660/iso9660_read.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.