#include <unistd.h>
#ifndef DEBUG
- #define exfat_debug(format, ...)
+ #define exfat_debug(format, ...) do {} while (0)
#endif
#if !defined(FUSE_VERSION) || (FUSE_VERSION < 26)
}
static int fuse_exfat_readdir(const char* path, void* buffer,
- fuse_fill_dir_t filler, off_t offset, struct fuse_file_info* fi)
+ fuse_fill_dir_t filler, UNUSED off_t offset,
+ UNUSED struct fuse_file_info* fi)
{
struct exfat_node* parent;
struct exfat_node* node;
return 0;
}
-static int fuse_exfat_create(const char* path, mode_t mode,
+static int fuse_exfat_create(const char* path, UNUSED mode_t mode,
struct fuse_file_info* fi)
{
struct exfat_node* node;
return 0;
}
-static int fuse_exfat_release(const char* path, struct fuse_file_info* fi)
+static int fuse_exfat_release(UNUSED const char* path,
+ struct fuse_file_info* fi)
{
/*
This handler is called by FUSE on close() syscall. If the FUSE
return 0; /* FUSE ignores this return value */
}
-static int fuse_exfat_flush(const char* path, struct fuse_file_info* fi)
+static int fuse_exfat_flush(UNUSED const char* path, struct fuse_file_info* fi)
{
/*
This handler may be called by FUSE on close() syscall. FUSE also deals
return exfat_flush_node(&ef, get_node(fi));
}
-static int fuse_exfat_fsync(const char* path, int datasync,
- struct fuse_file_info *fi)
+static int fuse_exfat_fsync(UNUSED const char* path, UNUSED int datasync,
+ UNUSED struct fuse_file_info *fi)
{
int rc;
return exfat_fsync(ef.dev);
}
-static int fuse_exfat_read(const char* path, char* buffer, size_t size,
- off_t offset, struct fuse_file_info* fi)
+static int fuse_exfat_read(UNUSED const char* path, char* buffer,
+ size_t size, off_t offset, struct fuse_file_info* fi)
{
exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
return exfat_generic_pread(&ef, get_node(fi), buffer, size, offset);
}
-static int fuse_exfat_write(const char* path, const char* buffer, size_t size,
- off_t offset, struct fuse_file_info* fi)
+static int fuse_exfat_write(UNUSED const char* path, const char* buffer,
+ size_t size, off_t offset, struct fuse_file_info* fi)
{
exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
return exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset);
return exfat_cleanup_node(&ef, node);
}
-static int fuse_exfat_mknod(const char* path, mode_t mode, dev_t dev)
+static int fuse_exfat_mknod(const char* path, UNUSED mode_t mode,
+ UNUSED dev_t dev)
{
exfat_debug("[%s] %s 0%ho", __func__, path, mode);
return exfat_mknod(&ef, path);
}
-static int fuse_exfat_mkdir(const char* path, mode_t mode)
+static int fuse_exfat_mkdir(const char* path, UNUSED mode_t mode)
{
exfat_debug("[%s] %s 0%ho", __func__, path, mode);
return exfat_mkdir(&ef, path);
return rc;
}
-static int fuse_exfat_chmod(const char* path, mode_t mode)
+static int fuse_exfat_chmod(UNUSED const char* path, mode_t mode)
{
const mode_t VALID_MODE_MASK = S_IFREG | S_IFDIR |
S_IRWXU | S_IRWXG | S_IRWXO;
return 0;
}
-static int fuse_exfat_chown(const char* path, uid_t uid, gid_t gid)
+static int fuse_exfat_chown(UNUSED const char* path, uid_t uid, gid_t gid)
{
exfat_debug("[%s] %s %u:%u", __func__, path, uid, gid);
if (uid != ef.uid || gid != ef.gid)
return 0;
}
-static int fuse_exfat_statfs(const char* path, struct statvfs* sfs)
+static int fuse_exfat_statfs(UNUSED const char* path, struct statvfs* sfs)
{
exfat_debug("[%s]", __func__);
#ifdef FUSE_CAP_BIG_WRITES
fci->want |= FUSE_CAP_BIG_WRITES;
#endif
+
+ /* mark super block as dirty; failure isn't a big deal */
+ exfat_soil_super_block(&ef);
+
return NULL;
}
-static void fuse_exfat_destroy(void* unused)
+static void fuse_exfat_destroy(UNUSED void* unused)
{
exfat_debug("[%s]", __func__);
exfat_unmount(&ef);
return ro ? add_option(options, "ro", NULL) : options;
}
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__)
static char* add_user_option(char* options)
{
struct passwd* pw;
options = add_ro_option(options, ro);
if (options == NULL)
return NULL;
-#if defined(__linux__) || defined(__FreeBSD__)
+#if defined(__linux__)
options = add_user_option(options);
if (options == NULL)
return NULL;
-#endif
-#if defined(__linux__)
options = add_blksize_option(options, CLUSTER_SIZE(*ef.sb));
if (options == NULL)
return NULL;
return options;
}
+static char* add_passthrough_fuse_options(char* fuse_options,
+ const char* options)
+{
+ const char* passthrough_list[] =
+ {
+#if defined(__FreeBSD__)
+ "automounted",
+#endif
+ "nonempty",
+ NULL
+ };
+ int i;
+
+ for (i = 0; passthrough_list[i] != NULL; i++)
+ if (exfat_match_option(options, passthrough_list[i]))
+ {
+ fuse_options = add_option(fuse_options, passthrough_list[i], NULL);
+ if (fuse_options == NULL)
+ return NULL;
+ }
+
+ return fuse_options;
+}
+
static int fuse_exfat_main(char* mount_options, char* mount_point)
{
char* argv[] = {"exfat", "-s", "-o", mount_options, mount_point, NULL};
exfat_options = strdup("ro_fallback");
if (fuse_options == NULL || exfat_options == NULL)
{
+ free(fuse_options);
+ free(exfat_options);
exfat_error("failed to allocate options string");
return 1;
}
free(fuse_options);
return 1;
}
+ fuse_options = add_passthrough_fuse_options(fuse_options, optarg);
+ if (fuse_options == NULL)
+ {
+ free(exfat_options);
+ return 1;
+ }
break;
case 'V':
free(exfat_options);