#include <fcntl.h>
#include <unistd.h>
#include <string.h>
+#include <errno.h>
#ifdef __APPLE__
#include <sys/disk.h>
#endif
int exfat_close(struct exfat_dev* dev)
{
+ int rc = 0;
+
#ifdef USE_UBLIO
if (ublio_close(dev->ufh) != 0)
+ {
exfat_error("failed to close ublio");
+ rc = -EIO;
+ }
#endif
if (close(dev->fd) != 0)
{
- free(dev);
exfat_error("failed to close device");
- return 1;
+ rc = -EIO;
}
free(dev);
- return 0;
+ return rc;
}
int exfat_fsync(struct exfat_dev* dev)
{
+ int rc = 0;
+
#ifdef USE_UBLIO
if (ublio_fsync(dev->ufh) != 0)
-#else
- if (fsync(dev->fd) != 0)
+ {
+ exfat_error("ublio fsync failed");
+ rc = -EIO;
+ }
#endif
+ if (fsync(dev->fd) != 0)
{
exfat_error("fsync failed");
- return 1;
+ rc = -EIO;
}
- return 0;
+ return rc;
}
enum exfat_mode exfat_get_mode(const struct exfat_dev* dev)
#endif
}
-void exfat_pread(struct exfat_dev* dev, void* buffer, size_t size,
+ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size,
off_t offset)
{
#ifdef USE_UBLIO
- if (ublio_pread(dev->ufh, buffer, size, offset) != size)
+ return ublio_pread(dev->ufh, buffer, size, offset);
#else
- if (pread(dev->fd, buffer, size, offset) != size)
+ return pread(dev->fd, buffer, size, offset);
#endif
- exfat_bug("failed to read %zu bytes from file at %"PRIu64, size,
- (uint64_t) offset);
}
-void exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size,
+ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size,
off_t offset)
{
#ifdef USE_UBLIO
- if (ublio_pwrite(dev->ufh, buffer, size, offset) != size)
+ return ublio_pwrite(dev->ufh, buffer, size, offset);
#else
- if (pwrite(dev->fd, buffer, size, offset) != size)
+ return pwrite(dev->fd, buffer, size, offset);
#endif
- exfat_bug("failed to write %zu bytes to file at %"PRIu64, size,
- (uint64_t) offset);
}
ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node,
return -1;
}
lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder);
- exfat_pread(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
+ if (exfat_pread(ef->dev, bufp, lsize,
+ exfat_c2o(ef, cluster) + loffset) < 0)
+ {
+ exfat_error("failed to read cluster %#x", cluster);
+ return -1;
+ }
bufp += lsize;
loffset = 0;
remainder -= lsize;
return -1;
}
lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder);
- exfat_pwrite(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
+ if (exfat_pwrite(ef->dev, bufp, lsize,
+ exfat_c2o(ef, cluster) + loffset) < 0)
+ {
+ exfat_error("failed to write cluster %#x", cluster);
+ return -1;
+ }
bufp += lsize;
loffset = 0;
remainder -= lsize;