2 #include <lunaix/fs/iso9660.h>
3 #include <lunaix/mm/valloc.h>
4 #include <lunaix/spike.h>
6 #include <klibc/string.h>
7 #include <sys/mm/pagetable.h>
10 iso9660_open(struct v_inode* this, struct v_file* file)
17 iso9660_close(struct v_file* file)
24 iso9660_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
26 // This read implementation handle both interleaved and non-interleaved
29 struct iso_inode* isoino = inode->data;
30 struct device* bdev = inode->sb->dev;
32 len = MIN(fpos + len, inode->fsize);
39 size_t fu_len = isoino->fu_size * ISO9660_BLKSZ;
40 // if fpos is not FU aligned, then we must do an extra read.
42 ICEIL(len, fu_len) + (fpos > fu_len && (fpos % fu_len) != 0);
43 size_t sec = (fpos % fu_len) / ISO9660_BLKSZ;
44 size_t wd_start = fpos % ISO9660_BLKSZ,
45 wd_len = MIN(len, ISO9660_BLKSZ - wd_start), i = 0;
47 // how many blocks (file unit + gaps) before of our current read position
48 size_t true_offset = (fpos / fu_len);
49 true_offset = true_offset * (isoino->fu_size + isoino->gap_size);
51 void* rd_buffer = valloc(ISO9660_BLKSZ);
53 true_offset += sec + inode->lb_addr;
57 for (; sec < isoino->fu_size && i < len; sec++) {
58 errno = bdev->ops.read(
59 bdev, rd_buffer, true_offset * ISO9660_BLKSZ, ISO9660_BLKSZ);
66 memcpy(buffer + i, rd_buffer + wd_start, wd_len);
71 wd_len = MIN(len - i, ISO9660_BLKSZ);
84 iso9660_read_page(struct v_inode* inode, void* buffer, size_t fpos)
86 return iso9660_read(inode, buffer, PAGE_SIZE, fpos);
90 iso9660_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
97 iso9660_write_page(struct v_inode* inode, void* buffer, size_t fpos)
104 iso9660_seek(struct v_inode* inode, size_t offset)