From: Felipe Barriga Richards 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 #include #include +#include #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