/* For pread()/pwrite()/utimensat() */
#define _XOPEN_SOURCE 700
-#include <fuse.h>
+#ifdef __APPLE__
+ #include <osxfuse/fuse.h>
+#else
+ #include <fuse.h>
+#endif
+
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "xattrs_config.h"
#include "utils.h"
+#include "stringmem.h"
int xmp_getattr(const char *path, struct stat *stbuf) {
int res;
char *_path = prepend_source_directory(path);
res = lstat(_path, stbuf);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = access(_path, mask);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = readlink(_path, buf, size - 1);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
} else {
char *_path = prepend_source_directory(path);
dp = opendir(_path);
- free(_path);
+ strfree(_path);
}
if (dp == NULL)
else
res = mknod(_path, mode, rdev);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = mkdir(_path, mode);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = unlink(_path);
- free(_path);
- if (res == -1)
+ if (res == -1) {
+ strfree(_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);
+ }
+ }
+ strfree(sidecar_path);
+ strfree(_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) {
char *_path = prepend_source_directory(path);
res = rmdir(_path);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_to = prepend_source_directory(to);
res = symlink(from, _to);
- free(_to);
+ strfree(_to);
if (res == -1)
return -errno;
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) {
+ strfree(_from);
+ strfree(_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);
+ }
+ }
+ strfree(from_sidecar_path);
+ strfree(to_sidecar_path);
+
+ strfree(_from);
+ strfree(_to);
return 0;
}
+// TODO: handle sidecar file ?
int xmp_link(const char *from, const char *to) {
int res;
if (xattrs_config.show_sidecar == 0) {
char *_from = prepend_source_directory(from);
char *_to = prepend_source_directory(to);
res = link(_from, _to);
- free(_from);
- free(_to);
+ strfree(_from);
+ strfree(_to);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = chmod(_path, mode);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = lchown(_path, uid, gid);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = truncate(_path, size);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
}
#ifdef HAVE_UTIMENSAT
-int xmp_utimens(const char *path, const struct timespec ts[2],
-struct fuse_file_info *fi)
-{
+int xmp_utimens(const char *path, const struct timespec ts[2]) {
if (xattrs_config.show_sidecar == 0 && filename_is_sidecar(path) == 1) {
return -ENOENT;
}
- (void) fi;
int res;
char *_path = prepend_source_directory(path);
/* don't use utime/utimes since they follow symlinks */
res = utimensat(0, _path, ts, AT_SYMLINK_NOFOLLOW);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;
char *_path = prepend_source_directory(path);
fd = open(_path, fi->flags);
- free(_path);
+ strfree(_path);
if (fd == -1)
return -errno;
char *_path = prepend_source_directory(path);
res = statvfs(_path, stbuf);
- free(_path);
+ strfree(_path);
if (res == -1)
return -errno;