support for hidding sidecar files.
authorFelipe Barriga Richards <spam@felipebarriga.cl>
Thu, 16 Feb 2017 15:17:35 +0000 (12:17 -0300)
committerFelipe Barriga Richards <spam@felipebarriga.cl>
Thu, 16 Feb 2017 17:10:56 +0000 (14:10 -0300)
TODO.md
fuse_xattrs.c
fuse_xattrs_config.h.in
passthrough.c
utils.c
utils.h
xattrs_config.h

diff --git a/TODO.md b/TODO.md
index 13be7cb459b4da58f1d91d797a8036d4eb73e53b..934bc418651c7d261e56a1593ea76dc8e070735a 100644 (file)
--- a/TODO.md
+++ b/TODO.md
@@ -5,7 +5,6 @@ TODO
 - Handle permission issues with .xattr files
 - Add options to:
   - Change extension name of sidecar files
-  - Hide sidecar files
 - Code Quality
   - Valgrind support
   - C unit tests
index 610ad4a13ec1a19dd51730dd60215d697f408c69..48e136b0796ea94ea840912d2138452002ffbc8f 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <stddef.h>
 
 #include <fuse.h>
 #include <sys/xattr.h>
 
 static int xmp_setxattr(const char *path, const char *name, const char *value, size_t size, int flags)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     if (get_namespace(name) != USER) {
         debug_print("Only user namespace is supported. name=%s\n", name);
         return -ENOTSUP;
@@ -66,6 +71,10 @@ static int xmp_setxattr(const char *path, const char *name, const char *value, s
 
 static int xmp_getxattr(const char *path, const char *name, char *value, size_t size)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     if (get_namespace(name) != USER) {
         debug_print("Only user namespace is supported. name=%s\n", name);
         return -ENOTSUP;
@@ -85,6 +94,10 @@ static int xmp_getxattr(const char *path, const char *name, char *value, size_t
 
 static int xmp_listxattr(const char *path, char *list, size_t size)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     if (size > XATTR_LIST_MAX) {
         debug_print("The size of the list of attribute names for this file exceeds the system-imposed limit.\n");
         return -E2BIG;
@@ -100,6 +113,10 @@ static int xmp_listxattr(const char *path, char *list, size_t size)
 
 static int xmp_removexattr(const char *path, const char *name)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     if (get_namespace(name) != USER) {
         debug_print("Only user namespace is supported. name=%s\n", name);
         return -ENOTSUP;
@@ -151,20 +168,6 @@ static struct fuse_operations xmp_oper = {
 };
 
 
-enum {
-    KEY_HELP,
-    KEY_VERSION,
-};
-
-
-static struct fuse_opt xattrs_opts[] = {
-        FUSE_OPT_KEY("-V", KEY_VERSION),
-        FUSE_OPT_KEY("--version", KEY_VERSION),
-        FUSE_OPT_KEY("-h", KEY_HELP),
-        FUSE_OPT_KEY("--help", KEY_HELP),
-        FUSE_OPT_END
-};
-
 int is_directory(const char *path) {
     struct stat statbuf;
     if (stat(path, &statbuf) != 0) {
@@ -222,6 +225,23 @@ const char *sanitized_source_directory(const char *path) {
     return absolute_path;
 }
 
+enum {
+    KEY_HELP,
+    KEY_VERSION,
+};
+
+#define FUSE_XATTRS_OPT(t, p, v) { t, offsetof(struct xattrs_config, p), v }
+
+static struct fuse_opt xattrs_opts[] = {
+        FUSE_XATTRS_OPT("show_sidecar",    show_sidecar, 1),
+
+        FUSE_OPT_KEY("-V",                 KEY_VERSION),
+        FUSE_OPT_KEY("--version",          KEY_VERSION),
+        FUSE_OPT_KEY("-h",                 KEY_HELP),
+        FUSE_OPT_KEY("--help",             KEY_HELP),
+        FUSE_OPT_END
+};
+
 static int xattrs_opt_proc(void *data, const char *arg, int key,
                            struct fuse_args *outargs) {
     (void) data;
@@ -243,6 +263,7 @@ static int xattrs_opt_proc(void *data, const char *arg, int key,
                             "    -V   --version   print version\n"
                             "\n"
                             "FUSE XATTRS options:\n"
+                            "    -o show_sidecar  don't hide sidecar files\n"
                             "\n", outargs->argv[0]);
 
             fuse_opt_add_arg(outargs, "-ho");
index bb27a565ae0ade7a161d8a8d85da50f0c98944c5..68825ae737bf219356412922beba24d396271b6f 100644 (file)
@@ -16,7 +16,4 @@
 #define XATTR_SIZE_MAX @XATTR_SIZE_MAX@
 #define XATTR_LIST_MAX @XATTR_LIST_MAX@
 
-
-
-
 #endif //CMAKE_FUSE_XATTRS_CONFIG_H
index 9ef527a3eaacb675cc8b62484cdc2c4e17be0b24..4b1ab7e66d78c1a4c2a58901878083b984673e79 100644 (file)
 #include <dirent.h>
 #include <errno.h>
 
-#include "fuse_xattrs_config.h"
-
 #include "xattrs_config.h"
 #include "utils.h"
 
 int xmp_getattr(const char *path, struct stat *stbuf) {
     int res;
 
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = lstat(_path, stbuf);
     free(_path);
@@ -42,6 +44,9 @@ int xmp_getattr(const char *path, struct stat *stbuf) {
 
 int xmp_access(const char *path, int mask) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = access(_path, mask);
@@ -55,6 +60,9 @@ int xmp_access(const char *path, int mask) {
 
 int xmp_readlink(const char *path, char *buf, size_t size) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = readlink(_path, buf, size - 1);
@@ -84,6 +92,10 @@ int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
         return -errno;
 
     while ((de = readdir(dp)) != NULL) {
+        if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(de->d_name) == 1) {
+            continue;
+        }
+
         struct stat st;
         memset(&st, 0, sizeof(st));
         st.st_ino = de->d_ino;
@@ -98,6 +110,10 @@ int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
 
 int xmp_mknod(const char *path, mode_t mode, dev_t rdev) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
 
     /* On Linux this could just be 'mknod(path, mode, rdev)' but this
@@ -120,6 +136,9 @@ int xmp_mknod(const char *path, mode_t mode, dev_t rdev) {
 
 int xmp_mkdir(const char *path, mode_t mode) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = mkdir(_path, mode);
@@ -133,6 +152,9 @@ int xmp_mkdir(const char *path, mode_t mode) {
 
 int xmp_unlink(const char *path) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = unlink(_path);
@@ -146,6 +168,9 @@ int xmp_unlink(const char *path) {
 
 int xmp_rmdir(const char *path) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = rmdir(_path);
@@ -159,6 +184,11 @@ int xmp_rmdir(const char *path) {
 
 int xmp_symlink(const char *from, const char *to) {
     int res;
+    if (xattrs_config.show_sidecar == 0) {
+        if (filename_is_sidecar(from) == 1 || filename_is_sidecar(to)) {
+            return -ENOENT;
+        }
+    }
 
     char *_to = prepend_source_directory(xattrs_config.source_dir, to);
     res = symlink(from, _to);
@@ -172,6 +202,11 @@ int xmp_symlink(const char *from, const char *to) {
 
 int xmp_rename(const char *from, const char *to) {
     int res;
+    if (xattrs_config.show_sidecar == 0) {
+        if (filename_is_sidecar(from) == 1 || filename_is_sidecar(to)) {
+            return -ENOENT;
+        }
+    }
 
     char *_from = prepend_source_directory(xattrs_config.source_dir, from);
     char *_to = prepend_source_directory(xattrs_config.source_dir, to);
@@ -187,6 +222,11 @@ int xmp_rename(const char *from, const char *to) {
 
 int xmp_link(const char *from, const char *to) {
     int res;
+    if (xattrs_config.show_sidecar == 0) {
+        if (filename_is_sidecar(from) == 1 || filename_is_sidecar(to)) {
+            return -ENOENT;
+        }
+    }
 
     char *_from = prepend_source_directory(xattrs_config.source_dir, from);
     char *_to = prepend_source_directory(xattrs_config.source_dir, to);
@@ -202,6 +242,9 @@ int xmp_link(const char *from, const char *to) {
 
 int xmp_chmod(const char *path, mode_t mode) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = chmod(_path, mode);
@@ -215,6 +258,9 @@ int xmp_chmod(const char *path, mode_t mode) {
 
 int xmp_chown(const char *path, uid_t uid, gid_t gid) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = lchown(_path, uid, gid);
@@ -228,6 +274,9 @@ int xmp_chown(const char *path, uid_t uid, gid_t gid) {
 
 int xmp_truncate(const char *path, off_t size) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = truncate(_path, size);
@@ -243,6 +292,10 @@ int xmp_truncate(const char *path, off_t size) {
 int xmp_utimens(const char *path, const struct timespec ts[2],
 struct fuse_file_info *fi)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     (void) fi;
     int res;
 
@@ -259,6 +312,9 @@ struct fuse_file_info *fi)
 
 int xmp_open(const char *path, struct fuse_file_info *fi) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = open(_path, fi->flags);
@@ -272,7 +328,12 @@ int xmp_open(const char *path, struct fuse_file_info *fi) {
 }
 
 int xmp_read(const char *path, char *buf, size_t size, off_t offset,
-             struct fuse_file_info *fi) {
+             struct fuse_file_info *fi)
+{
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     int fd;
     int res;
 
@@ -293,7 +354,12 @@ int xmp_read(const char *path, char *buf, size_t size, off_t offset,
 }
 
 int xmp_write(const char *path, const char *buf, size_t size,
-              off_t offset, struct fuse_file_info *fi) {
+              off_t offset, struct fuse_file_info *fi)
+{
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     int fd;
     int res;
 
@@ -315,6 +381,9 @@ int xmp_write(const char *path, const char *buf, size_t size,
 
 int xmp_statfs(const char *path, struct statvfs *stbuf) {
     int res;
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
 
     char *_path = prepend_source_directory(xattrs_config.source_dir, path);
     res = statvfs(_path, stbuf);
@@ -350,6 +419,10 @@ int xmp_fsync(const char *path, int isdatasync,
 int xmp_fallocate(const char *path, int mode,
                   off_t offset, off_t length, struct fuse_file_info *fi)
 {
+    if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
+        return -ENOENT;
+    }
+
     int fd;
     int res;
 
diff --git a/utils.c b/utils.c
index dbcaa29ea5634958058c590858141ea0412cf9e7..10593e6f90d67ed6a414937ea9dc509f22c28ccc 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -44,6 +44,24 @@ char *sanitize_value(const char *value, size_t value_size)
     return sanitized;
 }
 
+
+const size_t BINARY_SIDECAR_EXT_SIZE = strlen(BINARY_SIDECAR_EXT);
+
+const int filename_is_sidecar(const char *string) {
+    if(string == NULL)
+        return 0;
+
+    size_t size = strlen(string);
+    if (size <= BINARY_SIDECAR_EXT_SIZE)
+        return 0;
+
+    if (memcmp(string+size-BINARY_SIDECAR_EXT_SIZE, BINARY_SIDECAR_EXT, BINARY_SIDECAR_EXT_SIZE) == 0) {
+        return 1;
+    }
+
+    return 0;
+}
+
 enum namespace get_namespace(const char *name) {
     if (strncmp(name, "user.", strlen("user.")) == 0) {
         return USER;
diff --git a/utils.h b/utils.h
index 2a592e9956010a6adb561d612c69e8b7bdf0bbb5..b3b899bd992f26c24664e20f1d38c1743cf8630e 100644 (file)
--- a/utils.h
+++ b/utils.h
@@ -40,4 +40,7 @@ char *get_sidecar_path(const char *path);
 char *sanitize_value(const char *value, size_t value_size);
 char *prepend_source_directory(const char *a, const char *b);
 
+const size_t BINARY_SIDECAR_EXT_SIZE;
+const int filename_is_sidecar(const char *string);
+
 #endif //FUSE_XATTRS_UTILS_H
index b75f766a0318f635571d12862b0350e0943bfa85..38039020f26f9f19d52cc63a7250fefd98440b04 100644 (file)
@@ -11,6 +11,7 @@
 #define FUSE_XATTRS_CONFIG_H
 
 struct xattrs_config {
+    int show_sidecar;
     const char *source_dir;
 } xattrs_config;