From: Felipe Barriga Richards <spam@felipebarriga.cl>
Date: Thu, 16 Feb 2017 20:43:26 +0000 (-0300)
Subject: feature: remove/rename sidecar when removing/renaming files.
X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=99a69b6850cc3f8d03ae08c24bc9b89d2c72260c;p=rrq%2Ffuse_xattrs.git

feature: remove/rename sidecar when removing/renaming files.
---

diff --git a/ChangeLog b/ChangeLog
index da024b1..167ac05 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@ Release 0.2 (2017-02-16)
 * Hide sidecar files by default
 * Added man page
 * Fix crash
+* Remove sidecar when removing a file (same for renaming)
 * Optimization: don't open/close files for every operation
 
 Release 0.1 (2016-10-23)
diff --git a/fuse_xattrs.c b/fuse_xattrs.c
index b0461a0..276d57a 100644
--- a/fuse_xattrs.c
+++ b/fuse_xattrs.c
@@ -167,22 +167,6 @@ static struct fuse_operations xmp_oper = {
         .removexattr = xmp_removexattr,
 };
 
-
-int is_directory(const char *path) {
-    struct stat statbuf;
-    if (stat(path, &statbuf) != 0) {
-        fprintf(stderr, "cannot get source directory status: %s\n", path);
-        return -1;
-    }
-
-    if (!S_ISDIR(statbuf.st_mode)) {
-        fprintf(stderr, "source directory must be a directory: %s\n", path);
-        return -1;
-    }
-
-    return 1;
-}
-
 /**
  * Check if the path is valid. If it's a relative path,
  * prepend the working path.
diff --git a/passthrough.c b/passthrough.c
index b3827cc..cacc6b4 100644
--- a/passthrough.c
+++ b/passthrough.c
@@ -161,14 +161,25 @@ int xmp_unlink(const char *path) {
 
     char *_path = prepend_source_directory(path);
     res = unlink(_path);
-    free(_path);
 
-    if (res == -1)
+    if (res == -1) {
+        free(_path);
         return -errno;
+    }
+
+    char *sidecar_path = get_sidecar_path(_path);
+    if (is_regular_file(sidecar_path)) {
+        if (unlink(sidecar_path) == -1) {
+            error_print("Error removing sidecar file: %s\n", sidecar_path);
+        }
+    }
+    free(sidecar_path);
+    free(_path);
 
     return 0;
 }
 
+// FIXME: remove sidecar
 int xmp_rmdir(const char *path) {
     int res;
     if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1)  {
@@ -214,15 +225,32 @@ int xmp_rename(const char *from, const char *to) {
     char *_from = prepend_source_directory(from);
     char *_to = prepend_source_directory(to);
     res = rename(_from, _to);
-    free(_from);
-    free(_to);
 
-    if (res == -1)
+    if (res == -1) {
+        free(_from);
+        free(_to);
         return -errno;
+    }
+
+    char *from_sidecar_path = get_sidecar_path(_from);
+    char *to_sidecar_path = get_sidecar_path(_to);
+
+    // FIXME: Remove to_sidecar_path if it exists ?
+    if (is_regular_file(from_sidecar_path)) {
+        if (rename(from_sidecar_path, to_sidecar_path) == -1) {
+            error_print("Error renaming sidecar. from: %s to: %s\n", from_sidecar_path, to_sidecar_path);
+        }
+    }
+    free(from_sidecar_path);
+    free(to_sidecar_path);
+
+    free(_from);
+    free(_to);
 
     return 0;
 }
 
+// TODO: handle sidecar file ?
 int xmp_link(const char *from, const char *to) {
     int res;
     if (xattrs_config.show_sidecar == 0) {
diff --git a/utils.c b/utils.c
index 71fe009..2f935ab 100644
--- a/utils.c
+++ b/utils.c
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include "utils.h"
 #include "fuse_xattrs_config.h"
@@ -28,6 +29,34 @@ char *prepend_source_directory(const char *b) {
     return dst;
 }
 
+int is_directory(const char *path) {
+    struct stat statbuf;
+    if (stat(path, &statbuf) != 0) {
+        fprintf(stderr, "cannot get source directory status: %s\n", path);
+        return -1;
+    }
+
+    if (!S_ISDIR(statbuf.st_mode)) {
+        fprintf(stderr, "source directory must be a directory: %s\n", path);
+        return -1;
+    }
+
+    return 1;
+}
+
+int is_regular_file(const char *path) {
+    struct stat statbuf;
+    if (stat(path, &statbuf) != 0) {
+        return -1;
+    }
+
+    if (!S_ISREG(statbuf.st_mode)) {
+        return -1;
+    }
+
+    return 1;
+}
+
 char *get_sidecar_path(const char *path)
 {
     const size_t path_len = strlen(path);
diff --git a/utils.h b/utils.h
index 1c20826..3159eaa 100644
--- a/utils.h
+++ b/utils.h
@@ -43,4 +43,7 @@ char *prepend_source_directory(const char *b);
 const size_t BINARY_SIDECAR_EXT_SIZE;
 const int filename_is_sidecar(const char *string);
 
+int is_directory(const char *path);
+int is_regular_file(const char *path);
+
 #endif //FUSE_XATTRS_UTILS_H