3 * exFAT file system implementation library.
5 * Created by Andrew Nayenko on 02.09.09.
6 * This software is distributed under the GNU General Public License
7 * version 3 or any later.
11 #include <sys/types.h>
13 #define __USE_UNIX98 /* for pread() in Linux */
16 #if _FILE_OFFSET_BITS != 64
17 #error You should define _FILE_OFFSET_BITS=64
20 #define MIN(a, b) ((a) < (b) ? (a) : (b))
22 void exfat_read_raw(void* buffer, size_t size, off_t offset, int fd)
24 if (pread(fd, buffer, size, offset) != size)
25 exfat_bug("failed to read %zu bytes from file at %llu", size, offset);
28 ssize_t exfat_read(const struct exfat* ef, const struct exfat_node* node,
29 void* buffer, size_t size, off_t offset)
33 off_t lsize, loffset, remainder;
35 if (offset >= node->size)
40 cluster = exfat_advance_cluster(ef, node, node->start_cluster,
41 offset / CLUSTER_SIZE(*ef->sb));
42 if (CLUSTER_INVALID(cluster))
44 exfat_error("got invalid cluster");
48 loffset = offset % CLUSTER_SIZE(*ef->sb);
49 remainder = MIN(size, node->size - offset);
52 lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder);
53 exfat_read_raw(bufp, lsize, exfat_c2o(ef, cluster) + loffset, ef->fd);
57 cluster = exfat_next_cluster(ef, node, cluster);
58 if (CLUSTER_INVALID(cluster))
60 exfat_error("got invalid cluster");
64 return size - remainder;