X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=utils.c;h=a6a8b756f8b33cbb4dc37142e5abbb2db4fed459;hb=refs%2Fheads%2Fmaster;hp=ccb84b58f71357e68f518b88fe29d0b29c43af60;hpb=3f472567bdd9bc3fbfd99b342ee29b25d5b553be;p=rrq%2Ffuse_xattrs.git diff --git a/utils.c b/utils.c index ccb84b5..a6a8b75 100644 --- a/utils.c +++ b/utils.c @@ -10,22 +10,57 @@ #include #include #include +#include #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; }