add sroot option to help text
[rrq/fuse_xattrs.git] / utils.c
diff --git a/utils.c b/utils.c
index ccb84b58f71357e68f518b88fe29d0b29c43af60..a6a8b756f8b33cbb4dc37142e5abbb2db4fed459 100644 (file)
--- a/utils.c
+++ b/utils.c
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 
 #include "utils.h"
-#include "const.h"
+#include "fuse_xattrs_config.h"
+#include "xattrs_config.h"
+#include "stringmem.h"
 
+/* TODO: re-use memory to avoid calling malloc every time */
+char *prepend_source_directory(const char *b) {
+    return strjoin( xattrs_config.source_dir, b, 0 );
+}
+
+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);
-    const size_t sidecar_ext_len = strlen(SIDECAR_EXT); // this can be optimized
-    const size_t sidecar_path_len = path_len + sidecar_ext_len + 1;
-    char *sidecar_path = (char *) malloc(sidecar_path_len);
-    memset(sidecar_path, '\0', sidecar_path_len);
-    memcpy(sidecar_path, path, path_len);
-    memcpy(sidecar_path + path_len, SIDECAR_EXT, sidecar_ext_len);
-
-    return sidecar_path;
+#define CFG xattrs_config
+    if ( strncmp( path, CFG.source_dir, CFG.source_dir_size ) == 0 ) {
+       const char *p = path + CFG.source_dir_size;
+       if ( CFG.sidecar_dir ) {
+           return strjoin( CFG.sidecar_dir, p, BINARY_SIDECAR_EXT, 0 );
+       }
+    }
+    return strjoin( path, BINARY_SIDECAR_EXT, 0 );
+#undef CFG
 }
 
 // TODO: make it work for binary data
@@ -37,20 +72,50 @@ 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;
+}
+
+#define USER_NAMESPACE "user."
+#define SYSTEM_NAMESPACE "system."
+#define SECURITY_NAMESPACE "security."
+#define TRUSTED_NAMESPACE "trusted."
+
+const size_t USER_NAMESPACE_SIZE     = strlen(USER_NAMESPACE);
+const size_t SYSTEM_NAMESPACE_SIZE   = strlen(SYSTEM_NAMESPACE);
+const size_t SECURITY_NAMESPACE_SIZE = strlen(SECURITY_NAMESPACE);
+const size_t THRUSTED_NAMESPACE_SIZE = strlen(TRUSTED_NAMESPACE);
+
 enum namespace get_namespace(const char *name) {
-    if (strncmp(name, "user.", strlen("user.")) == 0) {
+    size_t name_size = strlen(name);
+
+    if (name_size > USER_NAMESPACE_SIZE && memcmp(name, USER_NAMESPACE, USER_NAMESPACE_SIZE) == 0) {
         return USER;
     }
 
-    if (strncmp(name, "system.", strlen("system.")) == 0) {
+    if (name_size > SYSTEM_NAMESPACE_SIZE && memcmp(name, SYSTEM_NAMESPACE, SYSTEM_NAMESPACE_SIZE) == 0) {
         return SYSTEM;
     }
 
-    if (strncmp(name, "security.", strlen("security.")) == 0) {
+    if (name_size > SECURITY_NAMESPACE_SIZE && memcmp(name, SECURITY_NAMESPACE, SECURITY_NAMESPACE_SIZE) == 0) {
         return SECURITY;
     }
 
-    if (strncmp(name, "trusted.", strlen("trusted.")) == 0) {
+    if (name_size > THRUSTED_NAMESPACE_SIZE && memcmp(name, TRUSTED_NAMESPACE, THRUSTED_NAMESPACE_SIZE) == 0) {
         return TRUSTED;
     }