/* * * (c) 2005-2009 Laurent Vivier * * This file has been copied from EMILE, http://emile.sf.net * */ #include "libiso9660.h" #include "libopenbios/bindings.h" #include "libc/diskio.h" #define offsetof(t,m) ((long)&(((t *)0)->m)) static void read_extent(iso9660_DIR *dir) { seek_io(dir->volume->fd, dir->extent * ISOFS_BLOCK_SIZE); read_io(dir->volume->fd, dir->buffer, ISOFS_BLOCK_SIZE); dir->len -= ISOFS_BLOCK_SIZE; dir->extent ++; dir->index = 0; } struct iso_directory_record *iso9660_readdir(iso9660_DIR *dir) { struct iso_directory_record *idr; if (dir->index > ISOFS_BLOCK_SIZE - offsetof(struct iso_directory_record, name[0])) { if (dir->len <= 0) return NULL; read_extent(dir); } idr = (struct iso_directory_record *) &dir->buffer[dir->index]; if (idr->length[0] == 0) { if (dir->len <= 0) return NULL; read_extent(dir); idr = (struct iso_directory_record *) &dir->buffer[dir->index]; } dir->index += dir->buffer[dir->index]; return idr; }